How We Know Who We Are

This recent election season exposed deep divides within Christians from different denominations. We still don’t have good data on exactly how Christians voted–exit polls are not reliable or useful for this question–but it is clear that there are substantial differences among Christians of different ages, churches and ethnicities. In particular, a lot of attention in the media centered on U.S. evangelical Christians, a very broad term that nonetheless is a good predictor of how people vote in elections.

I wanted to look more concretely at the question of what an evangelical Christian is. Instead of defining the term by what an evangelical Christian should be, I examined the question from the perspective of what American say about themselves. The best data source for this question are the Pew surveys on religion and politics, the most recent of which was just released. Although the survey dates from 2014, it is the best available evidence because it used a very large sample–over 30,000 respondents–and contained a battery of questions concerning both religious and political views. For that reason, it is ideal for understanding what it means to be evangelical.

There are different ways of slicing and dicing this survey. We could, for example, take the question from the survey that asks people if they are evangelical Christians, and then restrict our focus to only this group. However, the evangelical label has been stretched and challenged by so many people that it seems it can describe people with remarkably contrasting beliefs.

Religion Question Answer Percentage
Evangelical Do you believe in God? No 0%
None Do you believe in God? No 39%
Evangelical Do you believe in God? Yes 100%
None Do you believe in God? Yes 61%
Evangelical How often do you attend church? Less Than Weekly 40%
None How often do you attend church? Less Than Weekly 96%
Evangelical How often do you attend church? Weekly 60%
None How often do you attend church? Weekly 4%
Evangelical How often do you read Scripture? Less Than Monthly 24%
None How often do you read Scripture? Less Than Monthly 87%
Evangelical How often do you read Scripture? Monthly 76%
None How often do you read Scripture? Monthly 13%
Evangelical Is the Bible the Word of God? No 11%
None Is the Bible the Word of God? No 83%
Evangelical Is the Bible the Word of God? Yes 89%
None Is the Bible the Word of God? Yes 17%

Instead, I used a statistical model1 to collapse the survey’s questions down to two dimensions. I didn’t know ahead of time what dimensions these would be, although I suspected that it would collapse to a left-right political scale and a conservative-liberal theology scale. The data analysis largely confirms my prior suspicions. The table below shows the four questions that best explained each of the two dimensions:

Dimension 1 Dimension 2
Do you believe in God or a universal spirit? Do you prefer small or big government?
How important is religion in your life? Does government aid to the poor do more harm than good?
Is the Bible the Word of God? Are you conservative/moderate/liberal?
Should homosexuality be accepted by society? Should homosexuality be accepted by society?

I decided to label the first dimension as religious belief and the second dimension as political opinions. The first appears to measure the difference between secular-liberal and conservative religious beliefs, such as whether a person believes in God and believes that the Bible is the Word of God. The top question for the second dimension reflects a fundamental divide between the political left and the political right: the size of government. Similarly, the second-most divisive political question concerns a perennial debate over the welfare state and whether the government should be involved. What is interesting to note is that the question about homosexuality discriminates on both dimensions. Knowing someone’s views about homosexuality communicates information about both their religious and political beliefs, so we will certainly examine this question to understand how it fits in the picture.

The plot below shows respondents plotted along these dimensions. We can see from the general shape of the points that there is an oblong, Milky Way galaxy-type shape. This is because people tend to cluster in the top left, liberal religion and liberal politics, and on the bottom right, which is conservative religion and conservative politics. However, there are people who mix and match these beliefs, as they fall into the other two cells. People who are at the exact center are very difficult to classify using either dimension. These are the special cupcakes in the population: they don’t conform to our simplistic analysis of religion and politics. But for a large number of Americans, these two dimensions do tell us a lot.

We can use the other questions in the survey to analyze how people differ along their demographic background and political opinions, including religious denominations, age, income, government policies, and theological perspectives.

First of all, we can look at the list of religious groups to see how they all stack up against each other. We use a question from the survey that tracked a considerable number of religious categories so that we can look at evangelical Christians compared others. We plot each of these categories on our chart to see how they stand relative to all the respondents. The chart below shows the scores on the first dimensions, religious belief, for several different denominations and religious categories.

This plot should be interpreted with caution because it is using a limited number of questions to differentiate respondents along basic beliefs, such as belief in God and whether God’s word is inspired. However, it is still interesting that Evangelical Protestants are closer to Muslims than they are to Mainline Protestants or even Jewish people. This graph does seem to capture some intuitive idea about how close and far different religious groups are, at least when it comes to belief in God and the relative proximity between religious groups. As the Catholic philosopher Peter Kreeft once joked,

I often find more mutual understanding between myself and a fundamentalist Southern Baptist who sincerely believes I am worshipping the great whore of Babylon and on my way to Hell, or with a Muslim who uncompromisingly rejects my belief that Christ is Lord as utter pagan blasphemy, than I find with some active Catholic laity, nuns, especially ex-nuns, priests and even bishops!

In addition to religious beliefs, these self-reported affiliations tend to differ along political lines as well. We see below that many of the same patterns from religious affiliation are reproduced–nones and evangelicals are on opposite sides of the spectrum–but the relationship is much weaker. While religious differences run the entire length of the scale for the religious dimension, from -2 to +2, political differences are only about one-tenth as large, ranging from -0.2 to +0.2.

Next we look at demographic factors. First, do people of varying incomes tend to cluster in certain categories? Answering this question is not straightforward, especially as we want to know how income clusters respondents along both dimensions, religion and politics. The best way is to plot each income category as a line on top of the respondents so that we can see how income divides our respondents along religion and politics.

The chart below shows that the income lines do not divide the survey respondets along religious beliefs (the horizontal dimension), but rather mostly along the vertical dimension, political opinion. Again, this finding is not surprising given that wealthier people in the United States tend to be more conservative. It should be noted too, that these lines are just estimates–it is most likely that people in these income categories will fall in between these lines, but you can find plenty of respondents on the plot that don’t fall into these neat buckets. What it does tell us is that, regardless of religious belief, wealthier people are more conservative. On the other hand, we don’t know whether a wealthy person is necessarily more or less conservative when it comes to religion: there are both conservative and liberal wealthy believers.

To see the uncertainy in these estimates, I’ll color the respondents by whether or not each person makes more than $150,000. Darker colors indicate higher concentrations of wealthy respondents. We see in this chart that there is a clump of dark red in the upper-left corner corresponding to the liberal religion/liberal politics group, but that the clump in the bottom-right corner of conservative religion/conservative politics is much darker. In other words, there are wealthy respondents who are liberal politically, but there is a significantly larger group on the conservative end of the spectrum. This chart primarily serves to show how the lines reflect trends, not absolutes. Some people with high income will be politically liberal even if the majority of wealthy people are conservative.

Next we’ll look at education. This chart shows that the effect education is very different from income–while income tells us how politically conservative or liberal someone is, education is much more likely to tell us how conservative or liberal their religion is. It is also interesting to note that people with a high school education or less are very different than those who have at least some college or more schooling. Those with less than a college education are much more likely to be conservative on their religious views, but this difference doesn’t tell us much about their politics.

Given these two differing effects of income and education, we can learn something by putting the lines onto the same plot, making a cross-hatch. (Yes, I am literally putting people in boxes). Now we have a bunch of pick-up sticks laid on top of our chart. While it is a bit too much to absorb, it shows how income and education have a complicated interaction when it comes to people’s religious and political beliefs. To give just one interesting interpretation, there is a big box of people who have a very high income (more than $150K) but low education (high school or less). These people tend to have very conservative politics and their religious beliefs are also more conservative. On the flip side, the box with people with low income and high education shows that they are more liberal politically and they tend to have more liberal faith. In other words, people are complicated, and we can’t always know people’s beliefs just by knowing either their education or their income.

Now we’re going to dig deep into how people identify in terms of religion and what that says about their politics. First, we’ll look at responses to the question, “How often do you share your faith with non-believers or people from other religious backgrounds?” We see that this question generally corresponds to what we know of religious belief: those who share their faith “once or twice a month or more” tend to also have more conservative beliefs. In addition, there is a slight leftward tilt to the lines, which implies that these people also tend to be more liberal politically. It’s not a very strong relationship, but it is there, and it is quite interesting. Essentially, it means that people who share their faith a lot are in general more conservative in their religious beliefs. But when we look at people who are equally conservative in religious belief, those who share their faith are also more liberal (or moderate) politically.

Another important part of faith is praying. The chart below shows the predicted lines for a question that asks respondents how often they pray. Again, we see that praying is a good indicator of whether someone is more conservative religiously. We also see the same, even slighter, leftward tilt, implying that regardless of belief, people who pray a lot will tilt liberal politically. One additional note is that the “Never” category is way out to the left on religious belief. This happened because there are only a few people who never pray in America–this survey estimates it at about 1 in 10 Americans–so the model pushed them way outside the normal boundaries. This is a case where the model isn’t quite as accurate as it could be because of the small number of people in this particular category.

Finally, let’s look at how often people attend church (or place of worship), which is also a core component of all religions. These lines show an even more pronounced leftward tilt. This chart means that people who attend church are much more likely to be more conservative in their religious beliefs, but at the same time their political opinions are more liberal than fellow believers who don’t attend church.

Now that we’ve diagnosed the very interesting relationship between religious belief and religious practice, we can look at divisive political and religious questions that were asked of respondents. First, we’ll use a question that measures the exclusivity of people’s religious commitments. This question asked, “is your religion the one, true faith leading to eternal life, or can many religions lead to eternal life?” We only put one line on the chart below because this is a simple yes/no question. Those to the right of the line said that their religion is exclusive, while those to the left said that many religions can lead to eternal life. This question does not tell us much, if anything, about someone’s political views, but it does clearly delineate those who are very conservative in their religious beliefs from those who aren’t.

We first look at the question on homosexuality, which we know is very divisive on both dimensions. This question asked respondents, “should homosexuality be accepted by society?” Unlike religious practice, this question has a strong rightward tilt. This means that those who think homosexuality should be discouraged are more likely to be conservative politically and religiously. This question would appear to exemplify the divide between the groups that match conservative religious beliefs to conservative politics and vice versa. This line cuts the Milky Way galaxy of survey respondents neatly in half. We can also see that there are in general more respondents on the accept homosexuality side than the discourage homosexuality side.

Next we’ll examine environmental policy. This question asked respondents whether stricter environmental regulations are worth the added cost. This question is similar to the homosexuality question because it breaks down along political and religious lines. People who think environmental regulations are more important tend to be more liberal both politically and religously, although the relationship is stronger for their political ideology than for their faith.

Based on our analysis so far, we know that core political questions, such as welfare, environmental regulations, and homosexuality can all divide people on both religious and political grounds. The strongest divide is on homosexuality. However, we also find that there is a difference between religious belief and religious practice. People who are similarly conservative in religious belief differ in their political views depending on how much they practice their faith. Those who practice their faith more tend to be more liberal politically as well.

We’ll put up one last question from our survey. We know from the polls during the election that there was a divide between younger and older evangelicals over political candidates–generally speaking, older evangelicals preferred Trump, while younger evangelicals were much more likely to prefer third-party candidates or Clinton. For this chart, we’ll put up both the age categories and we will color respondents by whether or not they are evangelicals. It does not show a pretty picture. People who are younger tend to be both more liberal politically and religiously. On the flip side, people who are evangelicals are very conservative in general in terms of their religious views, and even compared to people who share the same religious views but wouldn’t choose the label evangelical, they are more conservative politically. In total, it seems that there is a looming split in the evangelical church between younger and older believers, with younger believers moving away from their older peers in both religious faith and political ideology.

This was an exploratory analysis, and these conclusions aren’t firm. But they do indicate the nature of politics and religion in America today, and the issues that divide us and unite us. Also, we shouldn’t just think of religious identity as a list of questions but also as a list of practices. When we note that certain political issues tend to divide Americans on both religious and political grounds, we can’t assume that all Americans are equally devoted to their religious traditions even if they believe them to be true. As is often the case, reality is more complicated than our limited perspectives allow it to be.

The potential conflict between younger and older evangelicals that our last chart illustrates is part of what motivates this web page. We want to offer a space for young evangelicals to hash out their political and religious differences in a setting that is non-confrontational, biblically-oriented, and open to any kind of controversial topic. We don’t want to limit ourselves to asking who to vote for every four years, but rather we want to be Christians who follow Christ in a political world.


  1. I used the R package mirt to estimate a 2PL item-response theory model. The full code is available in the code folder of our website’s Github at (http://www.github.com/saudiwin/saudiwin.github.io). The model includes sampling weights to account for the sampling design.

LS0tCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiAKICAgIHNlbGZfY29udGFpbmVkOiBmYWxzZQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCmxpYnJhcnkoaGF2ZW4pCnJlcXVpcmUoZHBseXIpCnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZShtYWdyaXR0cikKcmVxdWlyZShtaXJ0KQpyZXF1aXJlKHRpZHlyKQpyZXF1aXJlKHBsb3RseSkKcmVxdWlyZShzdHJpbmdyKQpyZXF1aXJlKGtuaXRyKQoKc291cmNlKCdjYWxjX3BvaW50c19mdW5jX1YzLlInKQoKa25pdHI6OnJlbmRlcl9qZWt5bGwoKQoKc2V0LnNlZWQoMTExMzc5KQoKRGF0YXNldF9QZXcgPC0gcmVhZF9zYXYoIkRhdGFzZXQgLSBQZXcgUmVzZWFyY2ggQ2VudGVyIDIwMTQgUmVsaWdpb3VzIExhbmRzY2FwZSBTdHVkeSBOYXRpb25hbCBUZWxlcGhvbmUgU3VydmV5IC0gVmVyc2lvbiAxLjEgLSBEZWNlbWJlciAxIDIwMTYuc2F2IikKCiNOZWVkIHRvIHJlbGFiZWwvcmVsZXZlbCBzb21lIHZhcmlhYmxlcyB0byBjYWxjdWxhdGUgY29ycmVjdCByZWZlcmVuY2UgY2F0ZWdvcmllcwoKRGF0YXNldF9QZXckUkVMVFJBRCA8LSBhc19mYWN0b3IoRGF0YXNldF9QZXckUkVMVFJBRCkKRGF0YXNldF9QZXckUkVMVFJBRCA8LSByZWxldmVsKERhdGFzZXRfUGV3JFJFTFRSQUQsIkRvbid0IGtub3cvcmVmdXNlZCAtIG5vIGluZm9ybWF0aW9uIG9uIHJlbGlnaW91cyBpZGVudGl0eSIpCmxldmVscyhEYXRhc2V0X1BldyRSRUxUUkFEKSA8LSBjKCJEb24ndCBLbm93IiwiRXZhbmdlbGljYWw8YnI+UHJvdGVzdGFudCIsIk1haW5saW5lPGJyPlByb3Rlc3RhbnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICJCbGFjazxicj5Qcm90ZXN0YW50IiwgIkNhdGhvbGljIiwgIk1vcm1vbiIsICJPcnRob2RveDxicj5DaHJpc3RpYW4iLCAiSmVob3ZhaCdzPGJyPldpdG5lc3MiLCJPdGhlcjxicj5DaHJpc3RpYW4iLCJKZXdpc2giLCJNdXNsaW0iLCJCdWRkaGlzdCIsIkhpbmR1IiwiT3RoZXI8YnI+UmVsaWdpb25zIiwiT3RoZXI8YnI+RmFpdGhzIiwiTm9uZSIpCgpEYXRhc2V0X1BldyRSRUxUUkFEIDwtIHJlY29kZV9mYWN0b3IoRGF0YXNldF9QZXckUkVMVFJBRCwnT3RoZXI8YnI+UmVsaWdpb25zJz0iT3RoZXI8YnI+RmFpdGhzIikKCmxldmVscyhEYXRhc2V0X1BldyRSRUxUUkFEKSA8LSBjKCJEb24ndCBLbm93IiwiQnVkZGhpc3QiLCJFdmFuZ2VsaWNhbDxicj5Qcm90ZXN0YW50IiwiTWFpbmxpbmU8YnI+UHJvdGVzdGFudCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJsYWNrPGJyPlByb3Rlc3RhbnQiLCAiQ2F0aG9saWMiLCAiTW9ybW9uIiwgIk9ydGhvZG94PGJyPkNocmlzdGlhbiIsICJKZWhvdmFoJ3M8YnI+V2l0bmVzcyIsIk90aGVyPGJyPkNocmlzdGlhbiIsIkpld2lzaCIsIk11c2xpbSIsIkhpbmR1IiwiT3RoZXI8YnI+RmFpdGhzIiwiTm9uZSIpCgpEYXRhc2V0X1BldyRpbmNvbWUgPC0gc3RyX2V4dHJhY3QoYXMuY2hhcmFjdGVyKGFzX2ZhY3RvcihEYXRhc2V0X1BldyRpbmNvbWUpKSxwYXR0ZXJuID0gJ1xcJFsxLTldKy4rJykKRGF0YXNldF9QZXckaW5jb21lIDwtIGFzX2ZhY3RvcihEYXRhc2V0X1BldyRpbmNvbWUpCmxldmVscyhEYXRhc2V0X1BldyRxaTJnKSA8LSBjKCdOZXZlcicsJ1NlbGRvbScsICdTZXZlcmFsIHRpbWVzIGEgeWVhcicsJ09uY2Ugb3IgdHdpY2UgYSBtb250aCcsJ0F0IGxlYXN0IG9uY2UgYSB3ZWVrJykKCmRhdGEgPC0gRGF0YXNldF9QZXcKCiNOZWVkIHRvIHVzZSBzdXJ2ZXkgd2VpZ2h0cy4gV29uJ3QgY2hhbmdlIGFjdHVhbCBhbmFseXNpcyB2ZXJ5IG11Y2gsIGJ1dCBzdGlsbCBhIGdvb2QgdGhpbmcgdG8gZG8KCndlaWdodHMgPC0gRGF0YXNldF9QZXckV0VJR0hUCgojIEtlZXAgdmFyaWFibGVzCgpkYXRhICU8PiUgc2VsZWN0KHFpMmcscWkyZCxxaTJiLHFpMmEscWkxLHFoMixxaDEscWc3YixxZzcscWc2LHFnNSxxZzFjLHFnMyxxZzEscWcxYixxZjIsCiAgICAgICAgICAgICAgICAgYXR0ZW5kLGJvcm4scmFjZXRobixtYXJpdGFsLHFiMzEscWIzMCxxYjIyLHFiMjEscWIyMCwKICAgICAgICAgICAgICAgICBxYjIxLHFiMjIscWIyMCxxYjJhLHFiMmMscWIyYixxYjJkLHFiMWMscWIxYixxYjFhLHFhMSxxaTMscXAzcmVjLGVkdWMsYWdlcmVjLAogICAgICAgICAgICAgICAgIHFtNWEscW01YixxbTVkLHFtNWUscW01ZixxbTVnLHBhcnR5LGlkZW8saW5jb21lLFJFTFRSQUQscWY1KQoKb3JkaW5hbF92YXJzIDwtIGMoJ3FpMmcnLCdxaTJkJywncWkyYicsJ3FpMmEnLCdxaTEnLCdxZzFiJywncWYyJywnYXR0ZW5kJywncWIyMicsJ3FiMjEnLCdxYjFjJywKICAgICAgICAgICAgICAgICAgJ3FiMWInLCdxYjFhJywncWExJywnZWR1YycsJ2FnZXJlYycsJ2lkZW8nLCdpbmNvbWUnKQpiaW5hcnlfdmFycyA8LSBjKCdxaDInLCdxaDEnLCdxZzcnLCdxZzdiJywncWc2JywncWc1JywncWcxYycsJ3FnMycsJ3FnMScsJ2Jvcm4nLCdxYjMwJywncWIyMCcsCiAgICAgICAgICAgICAgICAgJ3FiMmEnLCdxYjJjJywncWIyYicsJ3FiMmQnLCdxaTMnLCdxcDNyZWMnLCdxbTVhJywncW01YicsJ3FtNWQnLCdxbTVlJywncW01ZicsJ3FtNWcnLCdxZjUnKQpub21pbmFsX3ZhcnMgPC0gbmFtZXMoZGF0YSlbIShuYW1lcyhkYXRhKSAlaW4lIGMob3JkaW5hbF92YXJzLGJpbmFyeV92YXJzKSldCgphbGxfdmFycyA8LSBjKG9yZGluYWxfdmFycyxiaW5hcnlfdmFycyxub21pbmFsX3ZhcnMpCgojIE9yZGVyIGJ5IHRoZXNlIGNhdGVnb3JpZXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY29kZSB0aGVtIGZvciB0aGUgSVJUIG1vZGVsCgpkYXRhICU8PiUgc2VsZWN0KG9uZV9vZihjKG9yZGluYWxfdmFycyxiaW5hcnlfdmFycyxub21pbmFsX3ZhcnMpKSkKCmRhdGEgJTw+JSBhc19mYWN0b3IoJ2xhYmVscycpCgprZWVwX2xhYmVscyA8LSBsYXBwbHkoZGF0YSxsZXZlbHMpCgpkYXRhICU8PiUgbXV0YXRlX2FsbChmdW5zKGlmZWxzZShncmVwbCh4PS4scGF0dGVybj0iVk9MfE5hTnxbRGRdb24ndCBbS2tdbm93fFtScl1lZnVzZWR8VW5kZXNpZ25hdGVkfERpZCBOb3QgUmVwb3J0IiksTkEsLikpKQoKa2VlcF9sYWJlbHMgPC0gbGFwcGx5KGtlZXBfbGFiZWxzLGZ1bmN0aW9uKHgpIHsKICB4WyFncmVwbCh4PXgscGF0dGVybj0iVk9MfE5hTnxbRGRdb24ndCBbS2tdbm93fFtScl1lZnVzZWR8VW5kZXNpZ25hdGVkfERpZCBOb3QgUmVwb3J0IildCn0pCmtlZXBfbmFtZXMgPC0gbmFtZXMoZGF0YSkKZGF0YSA8LSAgbGFwcGx5KDE6bGVuZ3RoKG5hbWVzKGRhdGEpKSxmdW5jdGlvbih4KSB7CiAgdGhpc19jb2wgPC0gZGF0YVtbeF1dCiAgdGhpc19jb2wgPC0gZmFjdG9yKHRoaXNfY29sLGxhYmVscz1rZWVwX2xhYmVsc1tbeF1dKQogIHJldHVybih0aGlzX2NvbCkKfSkKbmFtZXMoZGF0YSkgPC0ga2VlcF9uYW1lcwpkYXRhICU8PiUgYXNfZGF0YV9mcmFtZQoKaXRlbV90eXBlcyA8LSBjKHJlcCgnZ3JhZGVkJyxsZW5ndGgob3JkaW5hbF92YXJzKSksCiAgICAgICAgICAgICAgICByZXAoJzJQTCcsbGVuZ3RoKGJpbmFyeV92YXJzKSksCiAgICAgICAgICAgICAgICByZXAoJ25vbWluYWwnLGxlbmd0aChub21pbmFsX3ZhcnMpKSkKCmRhdGEgJTw+JSBtdXRhdGUoUkVMVFJBRCA9IHJlbGV2ZWwoUkVMVFJBRCwnT3RoZXI8YnI+RmFpdGhzJykpCmxldmVscyhkYXRhJGluY29tZSkgPC0gYygnJDEwLDAwMCcsJyQyMCwwMDAnLCckMzAsMDAwJywnJDQwLDAwMCcsJyQ1MCwwMDAnLCckNzUsMDAwJywnJDEwMCwwMDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICckMTUwLDAwMCcsJyQxNTAsMDAwIG9yIG1vcmUnKQoKZGF0YSRlZHVjIDwtIGZhY3RvcihkYXRhJGVkdWMsbGV2ZWxzPSBjKCJMZXNzIHRoYW4gaGlnaCBzY2hvb2wgKEdyYWRlcyAxLTggb3Igbm8gZm9ybWFsIHNjaG9vbGluZykiLAogICAgICAgICAgICAgICAgICAgICAgICJIaWdoIHNjaG9vbCBpbmNvbXBsZXRlIChHcmFkZXMgOS0xMSBvciBHcmFkZSAxMiB3aXRoIE5PIGRpcGxvbWEpIiwKICAgICAgICAgICAgICAgICAgICAgICAiSGlnaCBzY2hvb2wgZ3JhZHVhdGUgKEdyYWRlIDEyIHdpdGggZGlwbG9tYSBvciBHRUQgY2VydGlmaWNhdGUpIiwKICAgICAgICAgICAgICAgICAgICAgICAiU29tZSBjb2xsZWdlLCBubyBkZWdyZWUgKGluY2x1ZGVzIHNvbWUgY29tbXVuaXR5IGNvbGxlZ2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAiVHdvIHllYXIgYXNzb2NpYXRlIGRlZ3JlZSBmcm9tIGEgY29sbGVnZSBvciB1bml2ZXJzaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAiRm91ciB5ZWFyIGNvbGxlZ2Ugb3IgdW5pdmVyc2l0eSBkZWdyZWUvQmFjaGVsb3IncyBkZWdyZWUgKGUuZy4sIEJTLCBCQSwgQUIpIiwKICAgICAgICAgICAgICAgICAgICAgICAiU29tZSBwb3N0Z3JhZHVhdGUgb3IgcHJvZmVzc2lvbmFsIHNjaG9vbGluZywgbm8gcG9zdGdyYWR1YXRlIGRlZ3JlZSAoZS5nLiBzb21lIGdyYWR1YXRlIHNjaG9vbCkiLAogICAgICAgICAgICAgICAgICAgICAgICJQb3N0Z3JhZHVhdGUgb3IgcHJvZmVzc2lvbmFsIGRlZ3JlZSwgaW5jbHVkaW5nIG1hc3RlcidzLCBkb2N0b3JhdGUsIG1lZGljYWwgb3IgbGF3IGRlZ3JlZSAoZS5nLiwgTUEsIE1TLCBQaEQsIE1ELi4uKSIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCdNaWRkbGUgU2Nob29sJywnU29tZSBIUycsJ0hTIEdyYWQnLCdTb21lIENvbGxlZ2UnLCcyLXlyIERlZ3JlZScsJzQteXIgRGVncmVlJywnU29tZSBHcmFkIFNjaG9vbCcsJ0dyYWQgRGVncmVlJykpCgojT25lIG9mIHRoZSBxdWVzdGlvbnMgaGFzIHZlcnkgb2RkIHF1ZXN0aW9uIG9yZGVyLCBuZWVkIHRvIGNoYW5nZSB0byBtYWtlIGZ1bGx5IG9yZGluYWwKCmRhdGEkcWIxYSA8LSBmYWN0b3IoZGF0YSRxYjFhLGxldmVscz1jKCJDaGFuZ2UgZm9yIHRoZSBiZXR0ZXIiLCJIYXNuJ3QgbWFkZSBtdWNoIGRpZmZlcmVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbmdlIGZvciB0aGUgd29yc2UiKSkKZGF0YSRxYjFiIDwtIGZhY3RvcihkYXRhJHFiMWIsbGV2ZWxzPWMoIkNoYW5nZSBmb3IgdGhlIGJldHRlciIsIkhhc24ndCBtYWRlIG11Y2ggZGlmZmVyZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGFuZ2UgZm9yIHRoZSB3b3JzZSIpKQpkYXRhJHFiMWMgPC0gZmFjdG9yKGRhdGEkcWIxYyxsZXZlbHM9YygiQ2hhbmdlIGZvciB0aGUgYmV0dGVyIiwiSGFzbid0IG1hZGUgbXVjaCBkaWZmZXJlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYW5nZSBmb3IgdGhlIHdvcnNlIikpCgpudW1lcmljIDwtIGRhdGEubWF0cml4KGRhdGEpCmNvbG5hbWVzKG51bWVyaWMpIDwtIG5hbWVzKGRhdGEpCgojVW5pZGltZW5zaW9uYWwgMlBMIFJhc2NoIGNvbWJpbmVkIG9yZGluYWwvYmluYXJ5L25vbWluYWwgZmFjdG9yIGFuYWx5c2lzCiNJZiB5b3UgZ2V0IGFuIGVycm9yLCBqdXN0IHJlcnVuIHRoaXMgY29kZS4gU29tZXRpbWVzIHRoZSBFTSBhbGdvcml0aG0gY2FuIGdldCBzdHVjayBpbiBhIGZsYXQgbG9nLWxpa2VsaWhvb2QKbW9kZWwgPC0gbWlydChudW1lcmljLG1vZGVsPTIsaXRlbXR5cGU9aXRlbV90eXBlcyxzdXJ2ZXkud2VpZ2h0cz13ZWlnaHRzKQpwZXJzb25fc2NvcmVzIDwtIGZzY29yZXMobW9kZWwpICU+JSBhc19kYXRhX2ZyYW1lCgojTmVlZCB0byBjYWxjdWxhdGUgdGhlIG1pbi9tYXggcG9pbnRzIGZvciBwbG90dGluZwojV2UgZG9uJ3QgbmVlZCB0byB1c2UgYWxsIHRoZSBzY29yZXMgZm9yIHRoZXNlIGNhbGN1bGF0aW9ucywganVzdCBhIHNhbXBsZQpyb3dzX3VzZSA8LSBzYW1wbGUoMTpucm93KHBlcnNvbl9zY29yZXMpLDE1MDApCnNhbXBsZV9zY29yZXMgPC0gc2xpY2UocGVyc29uX3Njb3Jlcyxyb3dzX3VzZSkKc2FtcGxlX2RhdGEgPC0gc2xpY2UoZGF0YSxyb3dzX3VzZSkKc2FtcGxlX0RhdGFzZXQgPC0gc2xpY2UoRGF0YXNldF9QZXcscm93c191c2UpCiNXZSBuZWVkIHRvIGtub3cgbWluL21heCBvbiBhbGwgZGltZW5zaW9ucyBmb3IgcGxvdHRpbmcgdGhlIGxpbmVzIGNvcnJlY3RseQptYXRyaXhfc2NvcmVzIDwtIGFzLm1hdHJpeChzYW1wbGVfc2NvcmVzKQpyZWN0YW5nbGVfc2NvcmVzIDwtIGMobWluKHNhbXBsZV9zY29yZXMkRjEpLG1heChzYW1wbGVfc2NvcmVzJEYxKSwKICAgICAgICAgICAgICAgICAgICAgIG1pbihzYW1wbGVfc2NvcmVzJEYyKSxtYXgoc2FtcGxlX3Njb3JlcyRGMikpCm5hbWVzKHJlY3RhbmdsZV9zY29yZXMpIDwtIGMoJ21pbl94JywnbWF4X3gnLCdtaW5feScsJ21heF95JykKCiMgTmVlZCB0byB1c2UgdGhlIHNhbWUgcm90YXRpb24gYXMgdGhlIHBlcnNvbiBzY29yZXMKYWxsX2NvZWZzIDwtIGNvZWYobW9kZWwscm90YXRlPSdvYmxpbWluJykKCmFsbF9jb2VmcyRHcm91cFBhcnMgPC0gTlVMTApgYGAKCiMjIyBIb3cgV2UgS25vdyBXaG8gV2UgQXJlCgpUaGlzIHJlY2VudCBlbGVjdGlvbiBzZWFzb24gZXhwb3NlZCBkZWVwIGRpdmlkZXMgd2l0aGluIENocmlzdGlhbnMgZnJvbSBkaWZmZXJlbnQgZGVub21pbmF0aW9ucy4gV2Ugc3RpbGwgZG9uJ3QgaGF2ZSBnb29kIGRhdGEgb24gZXhhY3RseSBob3cgQ2hyaXN0aWFucyB2b3RlZC0tZXhpdCBwb2xscyBhcmUgbm90IHJlbGlhYmxlIG9yIHVzZWZ1bCBmb3IgdGhpcyBxdWVzdGlvbi0tYnV0IGl0IGlzIGNsZWFyIHRoYXQgdGhlcmUgYXJlIHN1YnN0YW50aWFsIGRpZmZlcmVuY2VzIGFtb25nIENocmlzdGlhbnMgb2YgZGlmZmVyZW50IGFnZXMsIGNodXJjaGVzIGFuZCBldGhuaWNpdGllcy4gSW4gcGFydGljdWxhciwgYSBsb3Qgb2YgYXR0ZW50aW9uIGluIHRoZSBtZWRpYSBjZW50ZXJlZCBvbiBVLlMuIGV2YW5nZWxpY2FsIENocmlzdGlhbnMsIGEgdmVyeSBicm9hZCB0ZXJtIHRoYXQgbm9uZXRoZWxlc3MgaXMgYSBnb29kIHByZWRpY3RvciBvZiBob3cgcGVvcGxlIHZvdGUgaW4gZWxlY3Rpb25zLgoKSSB3YW50ZWQgdG8gbG9vayBtb3JlIGNvbmNyZXRlbHkgYXQgdGhlIHF1ZXN0aW9uIG9mIHdoYXQgYW4gZXZhbmdlbGljYWwgQ2hyaXN0aWFuIGlzLiBJbnN0ZWFkIG9mIGRlZmluaW5nIHRoZSB0ZXJtIGJ5IHdoYXQgYW4gZXZhbmdlbGljYWwgQ2hyaXN0aWFuIHNob3VsZCBiZSwgSSBleGFtaW5lZCB0aGUgcXVlc3Rpb24gZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Ygd2hhdCBBbWVyaWNhbiBzYXkgYWJvdXQgdGhlbXNlbHZlcy4gVGhlIGJlc3QgZGF0YSBzb3VyY2UgZm9yIHRoaXMgcXVlc3Rpb24gYXJlIHRoZSBQZXcgc3VydmV5cyBvbiByZWxpZ2lvbiBhbmQgcG9saXRpY3MsIHRoZSBtb3N0IHJlY2VudCBvZiB3aGljaCB3YXMgW2p1c3QgcmVsZWFzZWRdKGh0dHA6Ly93d3cucGV3Zm9ydW0ub3JnL3JlbGlnaW91cy1sYW5kc2NhcGUtc3R1ZHkvKS4gQWx0aG91Z2ggdGhlIHN1cnZleSBkYXRlcyBmcm9tIDIwMTQsIGl0IGlzIHRoZSBiZXN0IGF2YWlsYWJsZSBldmlkZW5jZSBiZWNhdXNlIGl0IHVzZWQgYSB2ZXJ5IGxhcmdlIHNhbXBsZS0tb3ZlciAzMCwwMDAgcmVzcG9uZGVudHMtLWFuZCBjb250YWluZWQgYSBiYXR0ZXJ5IG9mIHF1ZXN0aW9ucyBjb25jZXJuaW5nIGJvdGggcmVsaWdpb3VzIGFuZCBwb2xpdGljYWwgdmlld3MuIEZvciB0aGF0IHJlYXNvbiwgaXQgaXMgaWRlYWwgZm9yIHVuZGVyc3RhbmRpbmcgd2hhdCBpdCBtZWFucyB0byBiZSBldmFuZ2VsaWNhbC4KClRoZXJlIGFyZSBkaWZmZXJlbnQgd2F5cyBvZiBzbGljaW5nIGFuZCBkaWNpbmcgdGhpcyBzdXJ2ZXkuIFdlIGNvdWxkLCBmb3IgZXhhbXBsZSwgdGFrZSB0aGUgcXVlc3Rpb24gZnJvbSB0aGUgc3VydmV5IHRoYXQgYXNrcyBwZW9wbGUgaWYgdGhleSBhcmUgZXZhbmdlbGljYWwgQ2hyaXN0aWFucywgYW5kIHRoZW4gcmVzdHJpY3Qgb3VyIGZvY3VzIHRvIG9ubHkgdGhpcyBncm91cC4gSG93ZXZlciwgdGhlIGV2YW5nZWxpY2FsIGxhYmVsIGhhcyBiZWVuIHN0cmV0Y2hlZCBhbmQgY2hhbGxlbmdlZCBieSBzbyBtYW55IHBlb3BsZSB0aGF0IGl0IHNlZW1zIGl0IGNhbiBkZXNjcmliZSBwZW9wbGUgd2l0aCByZW1hcmthYmx5IGNvbnRyYXN0aW5nIGJlbGllZnMuIAoKYGBge3IsZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxyZXN1bHRzPSdhcy1pcyd9CmFsbF90YWJsZXMgPC0gZmlsdGVyKGBkYXRhYCxgZGF0YWAkUkVMVFJBRCAlaW4lIGMoJ0V2YW5nZWxpY2FsPGJyPlByb3Rlc3RhbnQnLCdOb25lJykpICU+JSAKICBtdXRhdGUoYXR0ZW5kPWlmZWxzZShhdHRlbmQgJWluJSBjKCdNb3JlIHRoYW4gb25jZSBhIHdlZWsnLCdPbmNlIGEgd2VlaycpLCdXZWVrbHknLCdMZXNzIFRoYW4gV2Vla2x5JyksCiAgICAgICAgcWkxID0gaWZlbHNlKHFpMSAlaW4lIGMoJ1NldmVyYWwgdGltZXMgYSBkYXknLCdPbmNlIGEgZGF5JyksJ0RhaWx5JywnTGVzcyBUaGFuIERhaWx5JyksCiAgICAgICAgIHFmMiA9IGlmZWxzZShxZjIgJWluJSBjKCdWZXJ5IGltcG9ydGFudCcsJ1NvbWV3aGF0IGltcG9ydGFudCcpLCdJbXBvcnRhbnQnLCdVbmltcG9ydGFudCcpLAogICAgICAgIHFnNyA9IGlmZWxzZShxZzcgJWluJSBjKCdbdGhlIEJpYmxlL3RoZSBUb3JhaC90aGUgS29yYW4vdGhlIEhvbHkgU2NyaXB0dXJlXSBpcyB0aGUgd29yZCBvZiBHb2QsIE9SJyksCiAgICAgICAgICAgICAgICAgICAgICdZZXMnLCdObycpLAogICAgICAgIHFpMmI9aWZlbHNlKHFpMmIgJWluJSBjKCdBdCBsZWFzdCBvbmNlIGEgd2VlaycsJ09uY2Ugb3IgdHdpY2UgYSBtb250aCcpLCdNb250aGx5JywnTGVzcyBUaGFuIE1vbnRobHknKSkgJT4lIAogIHNlbGVjdChSRUxUUkFELGF0dGVuZCxxaTEscWYyLHFmNSxxZzEscWc2LHFnNyxxaTJiKSAKb3V0X25hbWVzIDwtIGRhdGFfZnJhbWUobGFiZWxzPWMoJ1JFTFRSQUQnLCdIb3cgb2Z0ZW4gZG8geW91IGF0dGVuZCBjaHVyY2g/JywnSG93IG9mdGVuIGRvIHlvdSBwcmF5PycsCiAgICAgICAgICAgICAgICAgICAgICAgJ0hvdyBpbXBvcnRhbnQgaXMgcmVsaWdpb24gaW4geW91ciBsaWZlPycsJ0FyZSB5b3UgYSBtZW1iZXIgb2YgYSBjaHVyY2g/JywKICAgICAgICAgICAgICAgICAgICAgICAnRG8geW91IGJlbGlldmUgaW4gR29kPycsJ0RvIHlvdSB0aGluayB0aGVyZSBpcyBhIGhlbGw/JywnSXMgdGhlIEJpYmxlIHRoZSBXb3JkIG9mIEdvZD8nLAogICAgICAgICAgICAgICAgICAgICAgICdIb3cgb2Z0ZW4gZG8geW91IHJlYWQgU2NyaXB0dXJlPycpLAogICAgICAgICAgICAgICAgICAgICAgIG9yaWdfbmFtZXM9bmFtZXMoYWxsX3RhYmxlcykpCmFsbF90YWJsZXMgPC0gYWxsX3RhYmxlcyAlPiUgZ3JvdXBfYnkoUkVMVFJBRCkgJT4lIG5lc3QoKSAlPiUgCiAgbXV0YXRlKHRhYmxlcz1wdXJycjo6bWFwKGRhdGEsZnVuY3Rpb24oeCkgewogICAgYWxsX3RhYmxlcyA8LSBsYXBwbHkoeCxmdW5jdGlvbih5KSBhcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUoeSkpKSkKICB9KSkKCnRhYmxlX291dCA8LSBiaW5kX3Jvd3MoRXZhbmdlbGljYWw9YWxsX3RhYmxlcyR0YWJsZXNbWzJdXSwKICAgICAgICAgICAgICAgICAgICAgICBOb25lPWFsbF90YWJsZXMkdGFibGVzW1sxXV0sLmlkPSdpZCcpICU+JSBzZXBhcmF0ZShpZCxjKCdSZWxpZ2lvbicsJ1F1ZXN0aW9uJykpICU+JSAKICBsZWZ0X2pvaW4ob3V0X25hbWVzLGJ5PWMoJ1F1ZXN0aW9uJz0nb3JpZ19uYW1lcycpKSAlPiUgbXV0YXRlKFF1ZXN0aW9uPWxhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZXE9cGFzdGUocm91bmQoRnJlcSoxMDAsZGlnaXRzPTApLCIlIixzZXA9IiIpKSAlPiUgCiAgc2VsZWN0KC1sYWJlbHMpICU+JSAKICBhcnJhbmdlKFF1ZXN0aW9uLHksUmVsaWdpb24pICU+JSByZW5hbWUoQW5zd2VyPXksUGVyY2VudGFnZT1GcmVxKQoKZmlsdGVyKHRhYmxlX291dCxRdWVzdGlvbiAlaW4lIGMoJ0hvdyBvZnRlbiBkbyB5b3UgYXR0ZW5kIGNodXJjaD8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSG93IG9mdGVuIGRvIHlvdSByZWFkIFNjcmlwdHVyZT8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSXMgdGhlIEJpYmxlIHRoZSBXb3JkIG9mIEdvZD8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRG8geW91IGJlbGlldmUgaW4gR29kPycpLAogICAgICAgUmVsaWdpb249PSdFdmFuZ2VsaWNhbCcpICU+JSBrbml0cjo6a2FibGUoKQpgYGAKCgpJbnN0ZWFkLCBJIHVzZWQgYSBzdGF0aXN0aWNhbCBtb2RlbF5bSSB1c2VkIHRoZSBSIHBhY2thZ2UgbWlydCB0byBlc3RpbWF0ZSBhIDJQTCBpdGVtLXJlc3BvbnNlIHRoZW9yeSBtb2RlbC4gVGhlIGZ1bGwgY29kZSBpcyBhdmFpbGFibGUgaW4gdGhlIGNvZGUgZm9sZGVyIG9mIG91ciB3ZWJzaXRlJ3MgR2l0aHViIGF0IChodHRwOi8vd3d3LmdpdGh1Yi5jb20vc2F1ZGl3aW4vc2F1ZGl3aW4uZ2l0aHViLmlvKS4gVGhlIG1vZGVsIGluY2x1ZGVzIHNhbXBsaW5nIHdlaWdodHMgdG8gYWNjb3VudCBmb3IgdGhlIHNhbXBsaW5nIGRlc2lnbi5dIHRvIGNvbGxhcHNlIHRoZSBzdXJ2ZXkncyBxdWVzdGlvbnMgZG93biB0byB0d28gZGltZW5zaW9ucy4gSSBkaWRuJ3Qga25vdyBhaGVhZCBvZiB0aW1lIHdoYXQgZGltZW5zaW9ucyB0aGVzZSB3b3VsZCBiZSwgYWx0aG91Z2ggSSBzdXNwZWN0ZWQgdGhhdCBpdCB3b3VsZCBjb2xsYXBzZSB0byBhIGxlZnQtcmlnaHQgcG9saXRpY2FsIHNjYWxlIGFuZCBhIGNvbnNlcnZhdGl2ZS1saWJlcmFsIHRoZW9sb2d5IHNjYWxlLiBUaGUgZGF0YSBhbmFseXNpcyBsYXJnZWx5IGNvbmZpcm1zIG15IHByaW9yIHN1c3BpY2lvbnMuIFRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgZm91ciBxdWVzdGlvbnMgdGhhdCBiZXN0IGV4cGxhaW5lZCBlYWNoIG9mIHRoZSB0d28gZGltZW5zaW9uczoKCiAgICBEaW1lbnNpb24gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpbWVuc2lvbiAyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KRG8geW91IGJlbGlldmUgaW4gR29kIG9yIGEgdW5pdmVyc2FsIHNwaXJpdD8gICAgICAgICAgRG8geW91IHByZWZlciBzbWFsbCBvciBiaWcgZ292ZXJubWVudD8KSG93IGltcG9ydGFudCBpcyByZWxpZ2lvbiBpbiB5b3VyIGxpZmU/ICAgICAgICAgICAgICAgRG9lcyBnb3Zlcm5tZW50IGFpZCB0byB0aGUgcG9vciBkbyBtb3JlIGhhcm0gdGhhbiBnb29kPwpJcyB0aGUgQmlibGUgdGhlIFdvcmQgb2YgR29kPyAgICAgICAgICAgICAgICAgICAgICAgICBBcmUgeW91IGNvbnNlcnZhdGl2ZS9tb2RlcmF0ZS9saWJlcmFsPwpTaG91bGQgaG9tb3NleHVhbGl0eSBiZSBhY2NlcHRlZCBieSBzb2NpZXR5PyAgICAgICAgICBTaG91bGQgaG9tb3NleHVhbGl0eSBiZSBhY2NlcHRlZCBieSBzb2NpZXR5PwoKSSBkZWNpZGVkIHRvIGxhYmVsIHRoZSBmaXJzdCBkaW1lbnNpb24gYXMgcmVsaWdpb3VzIGJlbGllZiBhbmQgdGhlIHNlY29uZCBkaW1lbnNpb24gYXMgcG9saXRpY2FsIG9waW5pb25zLiBUaGUgZmlyc3QgYXBwZWFycyB0byBtZWFzdXJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc2VjdWxhci1saWJlcmFsIGFuZCBjb25zZXJ2YXRpdmUgcmVsaWdpb3VzIGJlbGllZnMsIHN1Y2ggYXMgd2hldGhlciBhIHBlcnNvbiBiZWxpZXZlcyBpbiBHb2QgYW5kIGJlbGlldmVzIHRoYXQgdGhlIEJpYmxlIGlzIHRoZSBXb3JkIG9mIEdvZC4gVGhlIHRvcCBxdWVzdGlvbiBmb3IgdGhlIHNlY29uZCBkaW1lbnNpb24gcmVmbGVjdHMgYSBmdW5kYW1lbnRhbCBkaXZpZGUgYmV0d2VlbiB0aGUgcG9saXRpY2FsIGxlZnQgYW5kIHRoZSBwb2xpdGljYWwgcmlnaHQ6IHRoZSBzaXplIG9mIGdvdmVybm1lbnQuIFNpbWlsYXJseSwgdGhlIHNlY29uZC1tb3N0IGRpdmlzaXZlIHBvbGl0aWNhbCBxdWVzdGlvbiBjb25jZXJucyBhIHBlcmVubmlhbCBkZWJhdGUgb3ZlciB0aGUgd2VsZmFyZSBzdGF0ZSBhbmQgd2hldGhlciB0aGUgZ292ZXJubWVudCBzaG91bGQgYmUgaW52b2x2ZWQuIFdoYXQgaXMgaW50ZXJlc3RpbmcgdG8gbm90ZSBpcyB0aGF0IHRoZSBxdWVzdGlvbiBhYm91dCBob21vc2V4dWFsaXR5IGRpc2NyaW1pbmF0ZXMgb24gKmJvdGgqIGRpbWVuc2lvbnMuIEtub3dpbmcgc29tZW9uZSdzIHZpZXdzIGFib3V0IGhvbW9zZXh1YWxpdHkgY29tbXVuaWNhdGVzIGluZm9ybWF0aW9uIGFib3V0IGJvdGggdGhlaXIgcmVsaWdpb3VzIGFuZCBwb2xpdGljYWwgYmVsaWVmcywgc28gd2Ugd2lsbCBjZXJ0YWlubHkgZXhhbWluZSB0aGlzIHF1ZXN0aW9uIHRvIHVuZGVyc3RhbmQgaG93IGl0IGZpdHMgaW4gdGhlIHBpY3R1cmUuCgpUaGUgcGxvdCBiZWxvdyBzaG93cyByZXNwb25kZW50cyBwbG90dGVkIGFsb25nIHRoZXNlIGRpbWVuc2lvbnMuIFdlIGNhbiBzZWUgZnJvbSB0aGUgZ2VuZXJhbCBzaGFwZSBvZiB0aGUgcG9pbnRzIHRoYXQgdGhlcmUgaXMgYW4gb2Jsb25nLCBNaWxreSBXYXkgZ2FsYXh5LXR5cGUgc2hhcGUuIFRoaXMgaXMgYmVjYXVzZSBwZW9wbGUgdGVuZCB0byBjbHVzdGVyIGluIHRoZSB0b3AgbGVmdCwgbGliZXJhbCByZWxpZ2lvbiBhbmQgbGliZXJhbCBwb2xpdGljcywgYW5kIG9uIHRoZSBib3R0b20gcmlnaHQsIHdoaWNoIGlzIGNvbnNlcnZhdGl2ZSByZWxpZ2lvbiBhbmQgY29uc2VydmF0aXZlIHBvbGl0aWNzLiBIb3dldmVyLCB0aGVyZSBhcmUgcGVvcGxlIHdobyBtaXggYW5kIG1hdGNoIHRoZXNlIGJlbGllZnMsIGFzIHRoZXkgZmFsbCBpbnRvIHRoZSBvdGhlciB0d28gY2VsbHMuIFBlb3BsZSB3aG8gYXJlIGF0IHRoZSBleGFjdCBjZW50ZXIgYXJlIHZlcnkgZGlmZmljdWx0IHRvIGNsYXNzaWZ5IHVzaW5nIGVpdGhlciBkaW1lbnNpb24uIFRoZXNlIGFyZSB0aGUgc3BlY2lhbCBjdXBjYWtlcyBpbiB0aGUgcG9wdWxhdGlvbjogdGhleSBkb24ndCBjb25mb3JtIHRvIG91ciBzaW1wbGlzdGljIGFuYWx5c2lzIG9mIHJlbGlnaW9uIGFuZCBwb2xpdGljcy4gQnV0IGZvciBhIGxhcmdlIG51bWJlciBvZiBBbWVyaWNhbnMsIHRoZXNlIHR3byBkaW1lbnNpb25zIGRvIHRlbGwgdXMgYSBsb3QuCgpgYGB7ciBmYWN0b3JfcGxvdCwgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTguNSxmaWcuaGVpZ2h0PTZ9CiNVc2Ugb25seSAxNTAwIHBvaW50cyBmb3IgYmV0dGVyIHBsb3R0aW5nCmEgPC0gbGlzdCgKICB4ID0gYyhyZWN0YW5nbGVfc2NvcmVzW1snbWF4X3gnXV0rLjUscmVjdGFuZ2xlX3Njb3Jlc1tbJ21pbl94J11dLS41LDAsLS4yNSksCiAgeSA9IGMoMCwwLHJlY3RhbmdsZV9zY29yZXNbWydtYXhfeSddXSsuNixyZWN0YW5nbGVfc2NvcmVzW1snbWluX3knXV0tLjYpLAogIHRleHQgPSBjKCdUcmFkaXRpb25hbDxicj5SZWxpZ2lvbicsCiAgICAgICAgICAgJ1Byb2dyZXNzaXZlPGJyPlJlbGlnaW9uJywKICAgICAgICAgICAnTGliZXJhbCBQb2xpdGljcycsCiAgICAgICAgICAgJ0NvbnNlcnZhdGl2ZSBQb2xpdGljcycpLAogIHhyZWYgPSAneCcsCiAgeXJlZiA9ICJ5IiwKICBzaG93YXJyb3cgPSBGQUxTRSwKICBheCA9IDAsCiAgYXkgPSAwCikKCnNhbXBsZV9zY29yZXMgJTw+JSBtdXRhdGUoZGF0YV9sYWJlbHM9cGFzdGUwKCdTdGF0ZTogJyxhc19mYWN0b3Ioc2FtcGxlX0RhdGFzZXQkc3RhdGUpLCc8YnI+JywnQWdlOiAnLHNhbXBsZV9kYXRhJGFnZXJlYywnPGJyPkluY29tZTogJyxzYW1wbGVfZGF0YSRpbmNvbWUsJzxicj5FZHVjYXRpb246ICcsc2FtcGxlX2RhdGEkZWR1YyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uPWFzX2ZhY3RvcihzYW1wbGVfRGF0YXNldCRjcmVnaW9uKSkKCnNhbXBsZV9zY29yZXMgJT4lIHBsb3RfbHkoeT1+RjIseD1+RjEsdGV4dD1+ZGF0YV9sYWJlbHMsY29sb3JzPSdHcmVlbnMnLGhvdmVyaW5mbz0ndGV4dCcpICU+JSBhZGRfbWFya2VycygpICU+JSAKICBsYXlvdXQoYW5ub3RhdGlvbnM9YSx4YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLAogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpKSAKYGBgCgoKV2UgY2FuIHVzZSB0aGUgb3RoZXIgcXVlc3Rpb25zIGluIHRoZSBzdXJ2ZXkgdG8gYW5hbHl6ZSBob3cgcGVvcGxlIGRpZmZlciBhbG9uZyB0aGVpciBkZW1vZ3JhcGhpYyBiYWNrZ3JvdW5kIGFuZCBwb2xpdGljYWwgb3BpbmlvbnMsIGluY2x1ZGluZyByZWxpZ2lvdXMgZGVub21pbmF0aW9ucywgYWdlLCBpbmNvbWUsIGdvdmVybm1lbnQgcG9saWNpZXMsIGFuZCB0aGVvbG9naWNhbCBwZXJzcGVjdGl2ZXMuCgpGaXJzdCBvZiBhbGwsIHdlIGNhbiBsb29rIGF0IHRoZSBsaXN0IG9mIHJlbGlnaW91cyBncm91cHMgdG8gc2VlIGhvdyB0aGV5IGFsbCBzdGFjayB1cCBhZ2FpbnN0IGVhY2ggb3RoZXIuIFdlIHVzZSBhIHF1ZXN0aW9uIGZyb20gdGhlIHN1cnZleSB0aGF0IHRyYWNrZWQgYSBjb25zaWRlcmFibGUgbnVtYmVyIG9mIHJlbGlnaW91cyBjYXRlZ29yaWVzIHNvIHRoYXQgd2UgY2FuIGxvb2sgYXQgZXZhbmdlbGljYWwgQ2hyaXN0aWFucyBjb21wYXJlZCBvdGhlcnMuIFdlIHBsb3QgZWFjaCBvZiB0aGVzZSBjYXRlZ29yaWVzIG9uIG91ciBjaGFydCB0byBzZWUgaG93IHRoZXkgc3RhbmQgcmVsYXRpdmUgdG8gYWxsIHRoZSByZXNwb25kZW50cy4gVGhlIGNoYXJ0IGJlbG93IHNob3dzIHRoZSBzY29yZXMgb24gdGhlIGZpcnN0IGRpbWVuc2lvbnMsIHJlbGlnaW91cyBiZWxpZWYsIGZvciBzZXZlcmFsIGRpZmZlcmVudCBkZW5vbWluYXRpb25zIGFuZCByZWxpZ2lvdXMgY2F0ZWdvcmllcy4gCgoKYGBge3IgcmVsdHJhZGUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTguNSxmaWcuaGVpZ2h0PTZ9CgpvcmRpbmFsX2NvZWZzIDwtIGFsbF9jb2Vmc1tpdGVtX3R5cGVzPT0nZ3JhZGVkJyB8IGl0ZW1fdHlwZXM9PScyUEwnXQpub21pbmFsX2NvZWZzIDwtIGFsbF9jb2Vmc1tpdGVtX3R5cGVzPT0nbm9taW5hbCddCgoKCnJlbHRyYWRfc2xvcGUgPC0gIG5vbWluYWxfY29lZnMkUkVMVFJBRFtncmVwbChwYXR0ZXJuPSdhWzAtOV0nLHg9YXR0cihub21pbmFsX2NvZWZzJFJFTFRSQUQsJ2RpbW5hbWVzJylbWzJdXSldCnJlbHRyYWRfY29lZnMgPC0gbm9taW5hbF9jb2VmcyRSRUxUUkFEW2dyZXBsKHBhdHRlcm49J2FrWzAtOV0rJyx4PWF0dHIobm9taW5hbF9jb2VmcyRSRUxUUkFELCdkaW1uYW1lcycpW1syXV0pXQpyZWx0cmFkX2RpZmYgPC0gbm9taW5hbF9jb2VmcyRSRUxUUkFEW2dyZXBsKHBhdHRlcm49J2RbMC05XSsnLHg9YXR0cihub21pbmFsX2NvZWZzJFJFTFRSQUQsJ2RpbW5hbWVzJylbWzJdXSldCiMgdGhlcmUgaXMgbm8gd2F5IHRvIGNhbGN1bGF0ZSB0aGlzIGVxdWlwcm9iYWJpbGl0eSBkaXJlY3RseSwgc28gd2Ugc2ltdWxhdGUgaXQgdXNpbmcgcmFuZG9tIGFiaWxpdGllcwojIGFiaWwxIDwtIHNhbXBsZShzZXEocmVjdGFuZ2xlX3Njb3Jlc1snbWluX3gnXSxyZWN0YW5nbGVfc2NvcmVzWydtYXhfeCddLGxlbmd0aC5vdXQ9MTAwMDAwMDApLDEwMDAwMDApCiMgYWJpbDIgPC0gc2FtcGxlKHNlcShyZWN0YW5nbGVfc2NvcmVzWydtaW5feSddLHJlY3RhbmdsZV9zY29yZXNbJ21heF95J10sbGVuZ3RoLm91dD0xMDAwMDAwMCksMTAwMDAwMCkKYWJpbF9tYXRyaXggPC0gZXhwYW5kLmdyaWQoc2VxKC01LDUsbGVuZ3RoLm91dD0xMDAwKSxzZXEoLTUsNSxsZW5ndGgub3V0PTEwMDApKQpleHBfY3VtX3N1bSA8LSByb3dTdW1zKGV4cCh0KHQoYXMubWF0cml4KHJlbHRyYWRfc2xvcGUpKSAlKiUgdChhYmlsX21hdHJpeCkpICUqJSB0KGFzLm1hdHJpeChyZWx0cmFkX2NvZWZzKSkgKyBtYXRyaXgocmVwKHJlbHRyYWRfZGlmZiwxMDAwMDAwKSxucm93PTEwMDAwMDAsbmNvbD1sZW5ndGgocmVsdHJhZF9kaWZmKSxieXJvdz1UUlVFKSkpCmluZGl2X3N1bSA8LSBsYXBwbHkoMTpsZW5ndGgocmVsdHJhZF9jb2VmcyksIGZ1bmN0aW9uKHgpIHsKICB5IDwtIGV4cChyZWx0cmFkX2NvZWZzW3hdICogdCh0KGFzLm1hdHJpeChyZWx0cmFkX3Nsb3BlKSkgJSolIHQoYWJpbF9tYXRyaXgpKSArIHJlbHRyYWRfZGlmZlt4XSkKfSkKaW5kaXZfcHJvYnMgPC0gbGFwcGx5KGluZGl2X3N1bSxmdW5jdGlvbih4KSB7CiAgeSA8LSB4L2V4cF9jdW1fc3VtCiAgeSA8LSAoeSAtIG1lYW4oeSkpXjIKICB9KQojIG1heF9wcm9icyA8LSBzYXBwbHkoaW5kaXZfcHJvYnMsZnVuY3Rpb24oeCkKIyAgIHdoaWNoKHggJWluJSBzb3J0KHgpWzE6MTAwXSkpCiMgbWF4X3ZhbHMgPC0gYWJpbF9tYXRyaXhbbWF4X3Byb2JzLF0KIHJlbHRyYWRfbGFiZWxzIDwtIGxldmVscyhkYXRhJFJFTFRSQUQpWzI6bGVuZ3RoKGxldmVscyhkYXRhJFJFTFRSQUQpKV0KIyBkaW1zIDwtIHNhcHBseSgxOmxlbmd0aChyZWx0cmFkX2NvZWZzKSwgZnVuY3Rpb24oeCkgewojICAgKC1yZWx0cmFkX2RpZmZbeF0qcmVsdHJhZF9zbG9wZSkvKHNxcnQoc3VtKGluY29tZV9zbG9wZV4yKSkpCiMgICAKIyAgIH0pCgpyZWx0cmFkX2RhdGEgPC0gZGF0YV9mcmFtZShkaW0xPXJlbHRyYWRfc2xvcGVbWzFdXSpyZWx0cmFkX2NvZWZzW3JlbHRyYWRfY29lZnMhPTBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0yPXJlbHRyYWRfc2xvcGVbWzJdXSpyZWx0cmFkX2NvZWZzW3JlbHRyYWRfY29lZnMhPTBdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cmVsdHJhZF9sYWJlbHMpCiMgcmVsdHJhZF9kYXRhIDwtIGRhdGFfZnJhbWUoZGltMT1kaW1zWzEsLTFdLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbTI9ZGltc1syLC0xXSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cmVsdHJhZF9sYWJlbHMpCnJlbHRyYWRfZGF0YSAlPiUgcGxvdF9seSh0eXBlPSdiYXInLHg9fmRpbTEseT1+cmVvcmRlcihsYWJlbHMsZGltMSksb3JpZW50YXRpb249J2gnLHRleHQ9fmxhYmVscykgJT4lIGxheW91dCh4YXhpcz1saXN0KHRpdGxlPSdSZWxpZ291cyBCZWxpZWYgKFByb2dyZXNzaXZlIHRvIFRyYWRpdGlvbmFsKScpLCB5YXhpcz1saXN0KHRpdGxlPScnKSxtYXJnaW49bGlzdChsPTEwMCksdGl0bGU9J1JlbGF0aXZlIFBvc2l0aW9uIG9mIEJlbGllZiBpbiBSZWxpZ2lvdXMgQ29tbXVuaXRpZXMnKQpgYGAKClRoaXMgcGxvdCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCBjYXV0aW9uIGJlY2F1c2UgaXQgaXMgdXNpbmcgYSBsaW1pdGVkIG51bWJlciBvZiBxdWVzdGlvbnMgdG8gZGlmZmVyZW50aWF0ZSByZXNwb25kZW50cyBhbG9uZyBiYXNpYyBiZWxpZWZzLCBzdWNoIGFzIGJlbGllZiBpbiBHb2QgYW5kIHdoZXRoZXIgR29kJ3Mgd29yZCBpcyBpbnNwaXJlZC4gSG93ZXZlciwgaXQgaXMgc3RpbGwgaW50ZXJlc3RpbmcgdGhhdCBFdmFuZ2VsaWNhbCBQcm90ZXN0YW50cyBhcmUgY2xvc2VyIHRvIE11c2xpbXMgdGhhbiB0aGV5IGFyZSB0byBNYWlubGluZSBQcm90ZXN0YW50cyBvciBldmVuIEpld2lzaCBwZW9wbGUuIFRoaXMgZ3JhcGggZG9lcyBzZWVtIHRvIGNhcHR1cmUgc29tZSBpbnR1aXRpdmUgaWRlYSBhYm91dCBob3cgY2xvc2UgYW5kIGZhciBkaWZmZXJlbnQgcmVsaWdpb3VzIGdyb3VwcyBhcmUsIGF0IGxlYXN0IHdoZW4gaXQgY29tZXMgdG8gYmVsaWVmIGluIEdvZCBhbmQgdGhlIHJlbGF0aXZlIHByb3hpbWl0eSBiZXR3ZWVuIHJlbGlnaW91cyBncm91cHMuIEFzIHRoZSBDYXRob2xpYyBwaGlsb3NvcGhlciBQZXRlciBLcmVlZnQgb25jZSBqb2tlZCwKCj4gSSBvZnRlbiBmaW5kIG1vcmUgbXV0dWFsIHVuZGVyc3RhbmRpbmcgYmV0d2VlbiBteXNlbGYgYW5kIGEgZnVuZGFtZW50YWxpc3QgU291dGhlcm4gQmFwdGlzdCB3aG8gc2luY2VyZWx5IGJlbGlldmVzIEkgYW0gd29yc2hpcHBpbmcgdGhlIGdyZWF0IHdob3JlIG9mIEJhYnlsb24gYW5kIG9uIG15IHdheSB0byBIZWxsLCBvciB3aXRoIGEgTXVzbGltIHdobyB1bmNvbXByb21pc2luZ2x5IHJlamVjdHMgbXkgYmVsaWVmIHRoYXQgQ2hyaXN0IGlzIExvcmQgYXMgdXR0ZXIgcGFnYW4gYmxhc3BoZW15LCB0aGFuIEkgZmluZCB3aXRoIHNvbWUgYWN0aXZlIENhdGhvbGljIGxhaXR5LCBudW5zLCBlc3BlY2lhbGx5IGV4LW51bnMsIHByaWVzdHMgYW5kIGV2ZW4gYmlzaG9wcyEgCgpJbiBhZGRpdGlvbiB0byByZWxpZ2lvdXMgYmVsaWVmcywgdGhlc2Ugc2VsZi1yZXBvcnRlZCBhZmZpbGlhdGlvbnMgdGVuZCB0byBkaWZmZXIgYWxvbmcgcG9saXRpY2FsIGxpbmVzIGFzIHdlbGwuIFdlIHNlZSBiZWxvdyB0aGF0IG1hbnkgb2YgdGhlIHNhbWUgcGF0dGVybnMgZnJvbSByZWxpZ2lvdXMgYWZmaWxpYXRpb24gYXJlIHJlcHJvZHVjZWQtLW5vbmVzIGFuZCBldmFuZ2VsaWNhbHMgYXJlIG9uIG9wcG9zaXRlIHNpZGVzIG9mIHRoZSBzcGVjdHJ1bS0tYnV0IHRoZSByZWxhdGlvbnNoaXAgaXMgbXVjaCB3ZWFrZXIuIFdoaWxlIHJlbGlnaW91cyBkaWZmZXJlbmNlcyBydW4gdGhlIGVudGlyZSBsZW5ndGggb2YgdGhlIHNjYWxlIGZvciB0aGUgcmVsaWdpb3VzIGRpbWVuc2lvbiwgZnJvbSAtMiB0byArMiwgcG9saXRpY2FsIGRpZmZlcmVuY2VzIGFyZSBvbmx5IGFib3V0IG9uZS10ZW50aCBhcyBsYXJnZSwgcmFuZ2luZyBmcm9tIC0wLjIgdG8gKzAuMi4KCmBgYHtyIHJlbHBvbCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxmaWcud2lkdGg9OC41LGZpZy5oZWlnaHQ9Nn0KCm9yZGluYWxfY29lZnMgPC0gYWxsX2NvZWZzW2l0ZW1fdHlwZXM9PSdncmFkZWQnIHwgaXRlbV90eXBlcz09JzJQTCddCm5vbWluYWxfY29lZnMgPC0gYWxsX2NvZWZzW2l0ZW1fdHlwZXM9PSdub21pbmFsJ10KcmVsdHJhZF9zbG9wZSA8LSAgbm9taW5hbF9jb2VmcyRSRUxUUkFEW2dyZXBsKHBhdHRlcm49J2FbMC05XScseD1hdHRyKG5vbWluYWxfY29lZnMkUkVMVFJBRCwnZGltbmFtZXMnKVtbMl1dKV0KcmVsdHJhZF9jb2VmcyA8LSBub21pbmFsX2NvZWZzJFJFTFRSQURbZ3JlcGwocGF0dGVybj0nYWtbMC05XSsnLHg9YXR0cihub21pbmFsX2NvZWZzJFJFTFRSQUQsJ2RpbW5hbWVzJylbWzJdXSldCnJlbHRyYWRfZGlmZiA8LSBub21pbmFsX2NvZWZzJFJFTFRSQURbZ3JlcGwocGF0dGVybj0nZFswLTldKycseD1hdHRyKG5vbWluYWxfY29lZnMkUkVMVFJBRCwnZGltbmFtZXMnKVtbMl1dKV0vcmVsdHJhZF9jb2VmcwoKcmVsdHJhZF9kYXRhIDwtIGRhdGFfZnJhbWUoZGltMT1yZWx0cmFkX3Nsb3BlW1sxXV0qcmVsdHJhZF9jb2Vmc1tyZWx0cmFkX2NvZWZzIT0wXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltMj1yZWx0cmFkX3Nsb3BlW1syXV0qcmVsdHJhZF9jb2Vmc1tyZWx0cmFkX2NvZWZzIT0wXSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXJlbHRyYWRfbGFiZWxzKQoKcmVsdHJhZF9kYXRhICU+JSBwbG90X2x5KHR5cGU9J2JhcicseD1+ZGltMix5PX5yZW9yZGVyKGxhYmVscyxkaW0yKSxvcmllbnRhdGlvbj0naCcsdGV4dD1+bGFiZWxzKSAlPiUgbGF5b3V0KHhheGlzPWxpc3QodGl0bGU9J1BvbGl0aWNhbCBJZGVvbG9neSAoQ29uc2VydmF0aXZlIHRvIExpYmVyYWwpJyksIHlheGlzPWxpc3QodGl0bGU9JycpLG1hcmdpbj1saXN0KGw9MTAwKSx0aXRsZT0nUmVsYXRpdmUgUG9zaXRpb24gb2YgUG9saXRpY2FsIE9waW5pb24gZm9yIFJlbGlnaW91cyBDb21tdW5pdGllcycpCmBgYAoKTmV4dCB3ZSBsb29rIGF0IGRlbW9ncmFwaGljIGZhY3RvcnMuIEZpcnN0LCBkbyBwZW9wbGUgb2YgdmFyeWluZyBpbmNvbWVzIHRlbmQgdG8gY2x1c3RlciBpbiBjZXJ0YWluIGNhdGVnb3JpZXM/IEFuc3dlcmluZyB0aGlzIHF1ZXN0aW9uIGlzIG5vdCBzdHJhaWdodGZvcndhcmQsIGVzcGVjaWFsbHkgYXMgd2Ugd2FudCB0byBrbm93IGhvdyBpbmNvbWUgY2x1c3RlcnMgcmVzcG9uZGVudHMgYWxvbmcgYm90aCBkaW1lbnNpb25zLCByZWxpZ2lvbiBhbmQgcG9saXRpY3MuIFRoZSBiZXN0IHdheSBpcyB0byBwbG90IGVhY2ggaW5jb21lIGNhdGVnb3J5IGFzIGEgbGluZSBvbiB0b3Agb2YgdGhlIHJlc3BvbmRlbnRzIHNvIHRoYXQgd2UgY2FuIHNlZSBob3cgaW5jb21lIGRpdmlkZXMgb3VyIHJlc3BvbmRlbnRzIGFsb25nIHJlbGlnaW9uIGFuZCBwb2xpdGljcy4KClRoZSBjaGFydCBiZWxvdyBzaG93cyB0aGF0IHRoZSBpbmNvbWUgbGluZXMgZG8gbm90IGRpdmlkZSB0aGUgc3VydmV5IHJlc3BvbmRldHMgYWxvbmcgcmVsaWdpb3VzIGJlbGllZnMgKHRoZSBob3Jpem9udGFsIGRpbWVuc2lvbiksIGJ1dCByYXRoZXIgbW9zdGx5IGFsb25nIHRoZSB2ZXJ0aWNhbCBkaW1lbnNpb24sIHBvbGl0aWNhbCBvcGluaW9uLiBBZ2FpbiwgdGhpcyBmaW5kaW5nIGlzIG5vdCBzdXJwcmlzaW5nIGdpdmVuIHRoYXQgd2VhbHRoaWVyIHBlb3BsZSBpbiB0aGUgVW5pdGVkIFN0YXRlcyB0ZW5kIHRvIGJlIG1vcmUgY29uc2VydmF0aXZlLiBJdCBzaG91bGQgYmUgbm90ZWQgdG9vLCB0aGF0IHRoZXNlIGxpbmVzIGFyZSBqdXN0IGVzdGltYXRlcy0taXQgaXMgbW9zdCBsaWtlbHkgdGhhdCBwZW9wbGUgaW4gdGhlc2UgaW5jb21lIGNhdGVnb3JpZXMgd2lsbCBmYWxsIGluIGJldHdlZW4gdGhlc2UgbGluZXMsIGJ1dCB5b3UgY2FuIGZpbmQgcGxlbnR5IG9mIHJlc3BvbmRlbnRzIG9uIHRoZSBwbG90IHRoYXQgZG9uJ3QgZmFsbCBpbnRvIHRoZXNlIG5lYXQgYnVja2V0cy4gV2hhdCBpdCBkb2VzIHRlbGwgdXMgaXMgdGhhdCwgcmVnYXJkbGVzcyBvZiByZWxpZ2lvdXMgYmVsaWVmLCB3ZWFsdGhpZXIgcGVvcGxlIGFyZSBtb3JlIGNvbnNlcnZhdGl2ZS4gT24gdGhlIG90aGVyIGhhbmQsIHdlIGRvbid0IGtub3cgd2hldGhlciBhIHdlYWx0aHkgcGVyc29uIGlzIG5lY2Vzc2FyaWx5IG1vcmUgb3IgbGVzcyBjb25zZXJ2YXRpdmUgd2hlbiBpdCBjb21lcyB0byByZWxpZ2lvbjogdGhlcmUgYXJlIGJvdGggY29uc2VydmF0aXZlIGFuZCBsaWJlcmFsIHdlYWx0aHkgYmVsaWV2ZXJzLgoKCmBgYHtyIHJlZ2lvbnMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTguNSxmaWcuaGVpZ2h0PTZ9CmluY29tZV9zbG9wZSA8LSAgb3JkaW5hbF9jb2VmcyRpbmNvbWVbZ3JlcGwocGF0dGVybj0nYVswLTldJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRpbmNvbWUsJ2RpbW5hbWVzJylbWzJdXSldCmluY29tZV9jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJGluY29tZVtncmVwbChwYXR0ZXJuPSdkWzAtOV0rJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRpbmNvbWUsJ2RpbW5hbWVzJylbWzJdXSldCmluY29tZV9sYWJlbHMgPC0gbGV2ZWxzKGRhdGEkaW5jb21lKVsyOmxlbmd0aChsZXZlbHMoZGF0YSRpbmNvbWUpKV0KZGltcyA8LSBzYXBwbHkoaW5jb21lX2NvZWZzLCBmdW5jdGlvbih4KSAoLXgqaW5jb21lX3Nsb3BlKS8oc3FydChzdW0oaW5jb21lX3Nsb3BlXjIpKSkpCmFsbF9wb2ludHNfaW5jb21lIDwtIGNhbGNfcG9pbnRzKGRpbXM9ZGltcyxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcyxsYWJlbHM9aW5jb21lX2xhYmVscykKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9ZGltc1sxLF0sZGltMj1kaW1zWzIsXSxsYWJlbHM9aW5jb21lX2xhYmVscykKCiBzYW1wbGVfc2NvcmVzICU+JSBwbG90X2x5KHk9fkYyLHg9fkYxLHRleHQ9fmRhdGFfbGFiZWxzLGNvbG9ycz0nR3JlZW5zJykgJT4lIGFkZF9tYXJrZXJzKGhvdmVyaW5mbz0ndGV4dCcsbmFtZT0nQWxsIFJlc3BvbmRlbnRzJyxvcGFjaXR5PTAuMixzaXplPTEpICU+JSAKICBsYXlvdXQoYW5ub3RhdGlvbnM9YSx4YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLAogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLAogICAgICAgICB0aXRsZT0nSW5jb21lJyxzaG93bGVnZW5kPUZBTFNFKSAlPiUgYWRkX2xpbmVzKGRhdGE9YWxsX3BvaW50c19pbmNvbWUseT1+eXBvaW50cyx4PX54cG9pbnRzLGNvbG9yPX5jYXRlZ29yaWVzLG5hbWU9J0luY29tZSBDYXRlZ29yaWVzJyxpbmhlcml0PUZBTFNFKSAlPiUgYWRkX3RleHQoZGF0YT10ZXh0X2RhdGEseD1+ZGltMSx5PX5kaW0yLHRleHQ9fmxhYmVscyxuYW1lPSdQb2ludCBMYWJlbHMnLHRleHRwb3NpdGlvbj0nYm90dG9tIHJpZ2h0Jyxjb2xvcj1JKCdncmF5MzAnKSkKYGBgCgpUbyBzZWUgdGhlIHVuY2VydGFpbnkgaW4gdGhlc2UgZXN0aW1hdGVzLCBJJ2xsIGNvbG9yIHRoZSByZXNwb25kZW50cyBieSB3aGV0aGVyIG9yIG5vdCBlYWNoIHBlcnNvbiBtYWtlcyBtb3JlIHRoYW4gJDE1MCwwMDAuIERhcmtlciBjb2xvcnMgaW5kaWNhdGUgaGlnaGVyIGNvbmNlbnRyYXRpb25zIG9mIHdlYWx0aHkgcmVzcG9uZGVudHMuIFdlIHNlZSBpbiB0aGlzIGNoYXJ0IHRoYXQgdGhlcmUgaXMgYSBjbHVtcCBvZiBkYXJrIHJlZCBpbiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgY29ycmVzcG9uZGluZyB0byB0aGUgbGliZXJhbCByZWxpZ2lvbi9saWJlcmFsIHBvbGl0aWNzIGdyb3VwLCBidXQgdGhhdCB0aGUgY2x1bXAgaW4gdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIgb2YgY29uc2VydmF0aXZlIHJlbGlnaW9uL2NvbnNlcnZhdGl2ZSBwb2xpdGljcyBpcyBtdWNoIGRhcmtlci4gSW4gb3RoZXIgd29yZHMsIHRoZXJlIGFyZSB3ZWFsdGh5IHJlc3BvbmRlbnRzIHdobyBhcmUgbGliZXJhbCBwb2xpdGljYWxseSwgYnV0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnRseSBsYXJnZXIgZ3JvdXAgb24gdGhlIGNvbnNlcnZhdGl2ZSBlbmQgb2YgdGhlIHNwZWN0cnVtLiBUaGlzIGNoYXJ0IHByaW1hcmlseSBzZXJ2ZXMgdG8gc2hvdyBob3cgdGhlIGxpbmVzIHJlZmxlY3QgdHJlbmRzLCBub3QgYWJzb2x1dGVzLiBTb21lIHBlb3BsZSB3aXRoIGhpZ2ggaW5jb21lIHdpbGwgYmUgcG9saXRpY2FsbHkgbGliZXJhbCBldmVuIGlmIHRoZSBtYWpvcml0eSBvZiB3ZWFsdGh5IHBlb3BsZSBhcmUgY29uc2VydmF0aXZlLgoKYGBge3IgaW5jb21lX3BvaW50cywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxmaWcud2lkdGg9OC41LGZpZy5oZWlnaHQ9Nn0KCiMgc2FtcGxlX3Njb3JlcyRncmFkX2RlZ3JlZSA8LSBmYWN0b3IoYXMubnVtZXJpYyhpZl9lbHNlKHNhbXBsZV9kYXRhJGluY29tZSAlaW4lIGMoJyQxMDAsMDAwJywnJDE1MCwwMDAnLCckMTUwLDAwMCBvciBtb3JlJyksCiMgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLEZBTFNFKSksbGFiZWxzPWMoJ1VuZGVyICQxMDBLJywnT3ZlciAkMTAwSycpKQojaG92ZXJpbmZvPSd0ZXh0JyxuYW1lPSdBbGwgUmVzcG9uZGVudHMnLG9wYWNpdHk9MC4yLHNpemU9SSg1MCkKI2NvbG9ycz12aXJpZGlzTGl0ZTo6aW5mZXJubygxMCksCiMKCgpmaWx0ZXIoc2FtcGxlX3Njb3JlcyxpZl9lbHNlKHNhbXBsZV9kYXRhJGluY29tZSAlaW4lICckMTUwLDAwMCBvciBtb3JlJyxUUlVFLEZBTFNFKSkgJT4lIHBsb3RfbHkoeT1+RjIseD1+RjEsY29sb3JzPSJSZWRzIikgJT4lIGFkZF9oaXN0b2dyYW0yZGNvbnRvdXIoKSAlPiUgCiAgbGF5b3V0KGFubm90YXRpb25zPWEseGF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgdGl0bGU9J051bWJlciBvZiBSZXNwb25kZW50cyB3aXRoIEluY29tZSBIaWdoZXIgdGhhbiAkMTUwSycpIApgYGAKCgpOZXh0IHdlJ2xsIGxvb2sgYXQgZWR1Y2F0aW9uLiBUaGlzIGNoYXJ0IHNob3dzIHRoYXQgdGhlIGVmZmVjdCBlZHVjYXRpb24gaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSBpbmNvbWUtLXdoaWxlIGluY29tZSB0ZWxscyB1cyBob3cgcG9saXRpY2FsbHkgY29uc2VydmF0aXZlIG9yIGxpYmVyYWwgc29tZW9uZSBpcywgZWR1Y2F0aW9uIGlzIG11Y2ggbW9yZSBsaWtlbHkgdG8gdGVsbCB1cyBob3cgY29uc2VydmF0aXZlIG9yIGxpYmVyYWwgdGhlaXIgcmVsaWdpb24gaXMuIEl0IGlzIGFsc28gaW50ZXJlc3RpbmcgdG8gbm90ZSB0aGF0IHBlb3BsZSB3aXRoIGEgaGlnaCBzY2hvb2wgZWR1Y2F0aW9uIG9yIGxlc3MgYXJlIHZlcnkgZGlmZmVyZW50IHRoYW4gdGhvc2Ugd2hvIGhhdmUgYXQgbGVhc3Qgc29tZSBjb2xsZWdlIG9yIG1vcmUgc2Nob29saW5nLiBUaG9zZSB3aXRoIGxlc3MgdGhhbiBhIGNvbGxlZ2UgZWR1Y2F0aW9uIGFyZSBtdWNoIG1vcmUgbGlrZWx5IHRvIGJlIGNvbnNlcnZhdGl2ZSBvbiB0aGVpciByZWxpZ2lvdXMgdmlld3MsIGJ1dCB0aGlzIGRpZmZlcmVuY2UgZG9lc24ndCB0ZWxsIHVzIG11Y2ggYWJvdXQgdGhlaXIgcG9saXRpY3MuCgoKCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD04LjUsZmlnLmhlaWdodD02fQplZHVjX3Nsb3BlIDwtICBvcmRpbmFsX2NvZWZzJGVkdWNbZ3JlcGwocGF0dGVybj0nYVswLTldJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRlZHVjLCdkaW1uYW1lcycpW1syXV0pXQplZHVjX2NvZWZzIDwtIG9yZGluYWxfY29lZnMkZWR1Y1tncmVwbChwYXR0ZXJuPSdkWzAtOV0rJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRlZHVjLCdkaW1uYW1lcycpW1syXV0pXQplZHVjX2xhYmVscyA8LSBsZXZlbHMoZGF0YSRlZHVjKVsyOmxlbmd0aChsZXZlbHMoZGF0YSRlZHVjKSldCmRpbXMgPC0gc2FwcGx5KGVkdWNfY29lZnMsIGZ1bmN0aW9uKHgpICgteCplZHVjX3Nsb3BlKS8oc3FydChzdW0oZWR1Y19zbG9wZV4yKSkpKQoKYWxsX3BvaW50c19lZHVjIDwtIGNhbGNfcG9pbnRzKGRpbXM9ZGltcyxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcyxsYWJlbHM9ZWR1Y19sYWJlbHMpCgojT2Zmc2V0IHRleHQgbGFiZWxzCmRpbXNbMixdIDwtIGRpbXNbMixdICsgc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PW5jb2woZGltcykpCgp0ZXh0X2RhdGEgPC0gZGF0YV9mcmFtZShkaW0xPWRpbXNbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0yPWRpbXNbMixdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9ZWR1Y19sYWJlbHMpCgoKIHNhbXBsZV9zY29yZXMgJT4lIHBsb3RfbHkoeT1+RjIseD1+RjEsdGV4dD1+ZGF0YV9sYWJlbHMsY29sb3JzPSdHcmVlbnMnKSAlPiUgYWRkX21hcmtlcnMoaG92ZXJpbmZvPSd0ZXh0JyxuYW1lPSdBbGwgUmVzcG9uZGVudHMnLG9wYWNpdHk9MC4yLHNpemU9MSkgJT4lIAogIGxheW91dChhbm5vdGF0aW9ucz1hLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiB5YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLAogdGl0bGU9J0VkdWNhdGlvbicsc2hvd2xlZ2VuZD1GQUxTRSkgJT4lIGFkZF9saW5lcyhkYXRhPWFsbF9wb2ludHNfZWR1Yyx5PX55cG9pbnRzLHg9fnhwb2ludHMsY29sb3I9fmNhdGVnb3JpZXMsaW5oZXJpdD1GQUxTRSxuYW1lPSdFZHVjYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9fmNhdGVnb3JpZXMpICU+JSAKICAgYWRkX3RleHQoZGF0YT10ZXh0X2RhdGEseD1+ZGltMSx5PX5kaW0yLHRleHQ9fmxhYmVscyxuYW1lPSdQb2ludCBMYWJlbHMnLHRleHRwb3NpdGlvbj0nYm90dG9tJyxjb2xvcj1JKCdncmF5MzAnKSxzaG93bGVnZW5kPUZBTFNFKQoKYGBgCgoKR2l2ZW4gdGhlc2UgdHdvIGRpZmZlcmluZyBlZmZlY3RzIG9mIGluY29tZSBhbmQgZWR1Y2F0aW9uLCB3ZSBjYW4gbGVhcm4gc29tZXRoaW5nIGJ5IHB1dHRpbmcgdGhlIGxpbmVzIG9udG8gdGhlIHNhbWUgcGxvdCwgbWFraW5nIGEgY3Jvc3MtaGF0Y2guIChZZXMsIEkgYW0gbGl0ZXJhbGx5IHB1dHRpbmcgcGVvcGxlIGluIGJveGVzKS4gTm93IHdlIGhhdmUgYSBidW5jaCBvZiBwaWNrLXVwIHN0aWNrcyBsYWlkIG9uIHRvcCBvZiBvdXIgY2hhcnQuIFdoaWxlIGl0IGlzIGEgYml0IHRvbyBtdWNoIHRvIGFic29yYiwgaXQgc2hvd3MgaG93IGluY29tZSBhbmQgZWR1Y2F0aW9uIGhhdmUgYSBjb21wbGljYXRlZCBpbnRlcmFjdGlvbiB3aGVuIGl0IGNvbWVzIHRvIHBlb3BsZSdzIHJlbGlnaW91cyBhbmQgcG9saXRpY2FsIGJlbGllZnMuIFRvIGdpdmUganVzdCBvbmUgaW50ZXJlc3RpbmcgaW50ZXJwcmV0YXRpb24sIHRoZXJlIGlzIGEgYmlnIGJveCBvZiBwZW9wbGUgd2hvIGhhdmUgYSB2ZXJ5IGhpZ2ggaW5jb21lIChtb3JlIHRoYW4gJDE1MEspIGJ1dCBsb3cgZWR1Y2F0aW9uIChoaWdoIHNjaG9vbCBvciBsZXNzKS4gVGhlc2UgcGVvcGxlIHRlbmQgdG8gaGF2ZSB2ZXJ5IGNvbnNlcnZhdGl2ZSBwb2xpdGljcyBhbmQgdGhlaXIgcmVsaWdpb3VzIGJlbGllZnMgYXJlIGFsc28gbW9yZSBjb25zZXJ2YXRpdmUuIE9uIHRoZSBmbGlwIHNpZGUsIHRoZSBib3ggd2l0aCBwZW9wbGUgd2l0aCBsb3cgaW5jb21lIGFuZCBoaWdoIGVkdWNhdGlvbiBzaG93cyB0aGF0IHRoZXkgYXJlIG1vcmUgbGliZXJhbCBwb2xpdGljYWxseSBhbmQgdGhleSB0ZW5kIHRvIGhhdmUgbW9yZSBsaWJlcmFsIGZhaXRoLiBJbiBvdGhlciB3b3JkcywgcGVvcGxlIGFyZSBjb21wbGljYXRlZCwgYW5kIHdlIGNhbid0IGFsd2F5cyBrbm93IHBlb3BsZSdzIGJlbGllZnMganVzdCBieSBrbm93aW5nIGVpdGhlciB0aGVpciBlZHVjYXRpb24gb3IgdGhlaXIgaW5jb21lLgoKCmBgYHtyLGVjaG89RkFMU0UsICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9CiBzYW1wbGVfc2NvcmVzICU+JSBwbG90X2x5KHk9fkYyLHg9fkYxLHRleHQ9fmRhdGFfbGFiZWxzKSAlPiUgYWRkX21hcmtlcnMoaG92ZXJpbmZvPSd0ZXh0JyxuYW1lPSdBbGwgUmVzcG9uZGVudHMnLG9wYWNpdHk9MC4yLHNpemU9MSxzaG93bGVnZW5kPUZBTFNFKSAlPiUgCiAgbGF5b3V0KGFubm90YXRpb25zPWEseGF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgdGl0bGU9J0JvdGggRWR1Y2F0aW9uIGFuZCBJbmNvbWUnKSAlPiUgYWRkX2xpbmVzKGRhdGE9YWxsX3BvaW50c19pbmNvbWUseT1+eXBvaW50cyx4PX54cG9pbnRzLGNvbG9yPX5jYXRlZ29yaWVzLGxpbmV0eXBlPX5jYXRlZ29yaWVzLG5hbWU9J0luY29tZSBDYXRlZ29yaWVzJyx0ZXh0PX5jYXRlZ29yaWVzLGNvbG9yc2NhbGU9IlJlZHMiLGluaGVyaXQ9RkFMU0UpICU+JSBhZGRfbGluZXMoZGF0YT1hbGxfcG9pbnRzX2VkdWMseT1+eXBvaW50cyx4PX54cG9pbnRzLGNvbG9yPX5jYXRlZ29yaWVzLGNvbG9yc2NhbGU9SSgiR3JlZW5zIiksbmFtZT0nRWR1Y2F0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PX5jYXRlZ29yaWVzKSAKYGBgCgoKTm93IHdlJ3JlIGdvaW5nIHRvIGRpZyBkZWVwIGludG8gaG93IHBlb3BsZSBpZGVudGlmeSBpbiB0ZXJtcyBvZiByZWxpZ2lvbiBhbmQgd2hhdCB0aGF0IHNheXMgYWJvdXQgdGhlaXIgcG9saXRpY3MuIEZpcnN0LCB3ZSdsbCBsb29rIGF0IHJlc3BvbnNlcyB0byB0aGUgcXVlc3Rpb24sICJIb3cgb2Z0ZW4gZG8geW91IHNoYXJlIHlvdXIgZmFpdGggd2l0aCBub24tYmVsaWV2ZXJzIG9yIHBlb3BsZSBmcm9tIG90aGVyIHJlbGlnaW91cyBiYWNrZ3JvdW5kcz8iIFdlIHNlZSB0aGF0IHRoaXMgcXVlc3Rpb24gZ2VuZXJhbGx5IGNvcnJlc3BvbmRzIHRvIHdoYXQgd2Uga25vdyBvZiByZWxpZ2lvdXMgYmVsaWVmOiB0aG9zZSB3aG8gc2hhcmUgdGhlaXIgZmFpdGggIm9uY2Ugb3IgdHdpY2UgYSBtb250aCBvciBtb3JlIiB0ZW5kIHRvIGFsc28gaGF2ZSBtb3JlIGNvbnNlcnZhdGl2ZSBiZWxpZWZzLiBJbiBhZGRpdGlvbiwgdGhlcmUgaXMgYSBzbGlnaHQgbGVmdHdhcmQgdGlsdCB0byB0aGUgbGluZXMsIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBwZW9wbGUgYWxzbyB0ZW5kIHRvIGJlIG1vcmUgKmxpYmVyYWwqIHBvbGl0aWNhbGx5LiBJdCdzIG5vdCBhIHZlcnkgc3Ryb25nIHJlbGF0aW9uc2hpcCwgYnV0IGl0IGlzIHRoZXJlLCBhbmQgaXQgaXMgcXVpdGUgaW50ZXJlc3RpbmcuIEVzc2VudGlhbGx5LCBpdCBtZWFucyB0aGF0IHBlb3BsZSB3aG8gc2hhcmUgdGhlaXIgZmFpdGggYSBsb3QgYXJlIGluIGdlbmVyYWwgbW9yZSBjb25zZXJ2YXRpdmUgaW4gdGhlaXIgcmVsaWdpb3VzIGJlbGllZnMuIEJ1dCB3aGVuIHdlIGxvb2sgYXQgcGVvcGxlIHdobyBhcmUgZXF1YWxseSBjb25zZXJ2YXRpdmUgaW4gcmVsaWdpb3VzIGJlbGllZiwgdGhvc2Ugd2hvIHNoYXJlIHRoZWlyIGZhaXRoIGFyZSBhbHNvIG1vcmUgbGliZXJhbCAob3IgbW9kZXJhdGUpIHBvbGl0aWNhbGx5LgoKCmBgYHtyLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTguNSxmaWcuaGVpZ2h0PTZ9CnNoYXJlX3Nsb3BlIDwtICBvcmRpbmFsX2NvZWZzJHFpMmdbZ3JlcGwocGF0dGVybj0nYVswLTldJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRxaTJnLCdkaW1uYW1lcycpW1syXV0pXQpzaGFyZV9jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJHFpMmdbZ3JlcGwocGF0dGVybj0nZFswLTldKycseD1hdHRyKG9yZGluYWxfY29lZnMkcWkyZywnZGltbmFtZXMnKVtbMl1dKV0Kc2hhcmVfbGFiZWxzIDwtIGxldmVscyhkYXRhJHFpMmcpWzI6bGVuZ3RoKGxldmVscyhkYXRhJHFpMmcpKV0KZGltcyA8LSBzYXBwbHkoc2hhcmVfY29lZnMsIGZ1bmN0aW9uKHgpICgteCpzaGFyZV9zbG9wZSkvKHNxcnQoc3VtKHNoYXJlX3Nsb3BlXjIpKSkpCgphbGxfcG9pbnRzIDwtIGNhbGNfcG9pbnRzKGRpbXM9ZGltcyxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcyxsYWJlbHM9c2hhcmVfbGFiZWxzKQoKI09mZnNldCB0ZXh0IGxhYmVscwpkaW1zWzIsXSA8LSBkaW1zWzIsXSArIHNlcShmcm9tPS0yLHRvPTIsbGVuZ3RoLm91dD1uY29sKGRpbXMpKQp0ZXh0X2RhdGEgPC0gZGF0YV9mcmFtZShkaW0xPWRpbXNbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICBkaW0yPWRpbXNbMixdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9c2hhcmVfbGFiZWxzKQoKCnNhbXBsZV9zY29yZXMgJT4lIHBsb3RfbHkoeT1+RjIseD1+RjEsdGV4dD1+ZGF0YV9sYWJlbHMsY29sb3JzPSdHcmVlbnMnKSAlPiUgYWRkX21hcmtlcnMoaG92ZXJpbmZvPSd0ZXh0JyxuYW1lPSdBbGwgUmVzcG9uZGVudHMnLG9wYWNpdHk9MC4yLHNpemU9MSkgJT4lIAogIGxheW91dChhbm5vdGF0aW9ucz1hLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHRpdGxlPSdIb3cgb2Z0ZW4gZG8geW91IHNoYXJlIHlvdXIgZmFpdGg/JyxzaG93bGVnZW5kPUZBTFNFKSAlPiUgYWRkX2xpbmVzKGRhdGE9YWxsX3BvaW50cyx5PX55cG9pbnRzLHg9fnhwb2ludHMsY29sb3I9fmNhdGVnb3JpZXMsaW5oZXJpdD1GQUxTRSxuYW1lPSdzaGFyZWF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9fmNhdGVnb3JpZXMpICU+JSBhZGRfdGV4dChkYXRhPXRleHRfZGF0YSx4PX5kaW0xLHk9fmRpbTIsdGV4dD1+bGFiZWxzLG5hbWU9J1BvaW50IExhYmVscycsY29sb3I9SSgnZ3JheTMwJyksdGV4dHBvc2l0aW9uPSdib3R0b20gcmlnaHQnKQpgYGAKCkFub3RoZXIgaW1wb3J0YW50IHBhcnQgb2YgZmFpdGggaXMgcHJheWluZy4gVGhlIGNoYXJ0IGJlbG93IHNob3dzIHRoZSBwcmVkaWN0ZWQgbGluZXMgZm9yIGEgcXVlc3Rpb24gdGhhdCBhc2tzIHJlc3BvbmRlbnRzIGhvdyBvZnRlbiB0aGV5IHByYXkuIEFnYWluLCB3ZSBzZWUgdGhhdCBwcmF5aW5nIGlzIGEgZ29vZCBpbmRpY2F0b3Igb2Ygd2hldGhlciBzb21lb25lIGlzIG1vcmUgY29uc2VydmF0aXZlIHJlbGlnaW91c2x5LiBXZSBhbHNvIHNlZSB0aGUgc2FtZSwgZXZlbiBzbGlnaHRlciwgbGVmdHdhcmQgdGlsdCwgaW1wbHlpbmcgdGhhdCByZWdhcmRsZXNzIG9mIGJlbGllZiwgcGVvcGxlIHdobyBwcmF5IGEgbG90IHdpbGwgdGlsdCBsaWJlcmFsIHBvbGl0aWNhbGx5LiBPbmUgYWRkaXRpb25hbCBub3RlIGlzIHRoYXQgdGhlICJOZXZlciIgY2F0ZWdvcnkgaXMgd2F5IG91dCB0byB0aGUgbGVmdCBvbiByZWxpZ2lvdXMgYmVsaWVmLiBUaGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlcmUgYXJlIG9ubHkgYSBmZXcgcGVvcGxlIHdobyBuZXZlciBwcmF5IGluIEFtZXJpY2EtLXRoaXMgc3VydmV5IGVzdGltYXRlcyBpdCBhdCBhYm91dCAxIGluIDEwIEFtZXJpY2Fucy0tc28gdGhlIG1vZGVsIHB1c2hlZCB0aGVtIHdheSBvdXRzaWRlIHRoZSBub3JtYWwgYm91bmRhcmllcy4gVGhpcyBpcyBhIGNhc2Ugd2hlcmUgdGhlIG1vZGVsIGlzbid0IHF1aXRlIGFzIGFjY3VyYXRlIGFzIGl0IGNvdWxkIGJlIGJlY2F1c2Ugb2YgdGhlIHNtYWxsIG51bWJlciBvZiBwZW9wbGUgaW4gdGhpcyBwYXJ0aWN1bGFyIGNhdGVnb3J5LgoKCmBgYHtyLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTguNSxmaWcuaGVpZ2h0PTZ9CnFpMV9zbG9wZSA8LSAgb3JkaW5hbF9jb2VmcyRxaTFbZ3JlcGwocGF0dGVybj0nYVswLTldJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRxaTEsJ2RpbW5hbWVzJylbWzJdXSldCnFpMV9jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJHFpMVtncmVwbChwYXR0ZXJuPSdkWzAtOV0rJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRxaTEsJ2RpbW5hbWVzJylbWzJdXSldCnFpMV9sYWJlbHMgPC0gbGV2ZWxzKGRhdGEkcWkxKVsyOmxlbmd0aChsZXZlbHMoZGF0YSRxaTEpKV0KZGltcyA8LSBzYXBwbHkocWkxX2NvZWZzLCBmdW5jdGlvbih4KSAoLXgqcWkxX3Nsb3BlKS8oc3FydChzdW0ocWkxX3Nsb3BlXjIpKSkpCgphbGxfcG9pbnRzIDwtIGNhbGNfcG9pbnRzKGRpbXM9ZGltcyxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcyxsYWJlbHM9cWkxX2xhYmVscykKCiNPZmZzZXQgdGV4dCBsYWJlbHMKZGltc1syLF0gPC0gZGltc1syLF0gKyBzZXEoZnJvbT0tMix0bz0yLGxlbmd0aC5vdXQ9bmNvbChkaW1zKSkKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9ZGltc1sxLF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRpbTI9ZGltc1syLF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1xaTFfbGFiZWxzKQoKCnNhbXBsZV9zY29yZXMgJT4lIHBsb3RfbHkoeT1+RjIseD1+RjEsdGV4dD1+ZGF0YV9sYWJlbHMsY29sb3JzPSdHcmVlbnMnKSAlPiUgYWRkX21hcmtlcnMoaG92ZXJpbmZvPSd0ZXh0JyxuYW1lPSdBbGwgUmVzcG9uZGVudHMnLG9wYWNpdHk9MC4yLHNpemU9MSkgJT4lIAogIGxheW91dChhbm5vdGF0aW9ucz1hLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHRpdGxlPSdIb3cgb2Z0ZW4gZG8geW91IHByYXk/JyxzaG93bGVnZW5kPUZBTFNFKSAlPiUgYWRkX2xpbmVzKGRhdGE9YWxsX3BvaW50cyx5PX55cG9pbnRzLHg9fnhwb2ludHMsY29sb3I9fmNhdGVnb3JpZXMsaW5oZXJpdD1GQUxTRSxuYW1lPSdxaTFhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PX5jYXRlZ29yaWVzKSAlPiUgYWRkX3RleHQoZGF0YT10ZXh0X2RhdGEseD1+ZGltMSx5PX5kaW0yLHRleHQ9fmxhYmVscyxuYW1lPSdQb2ludCBMYWJlbHMnLHRleHRwb3NpdGlvbj0nYm90dG9tIHJpZ2h0Jyxjb2xvcj1JKCdncmF5MzAnKSkKYGBgCgpGaW5hbGx5LCBsZXQncyBsb29rIGF0IGhvdyBvZnRlbiBwZW9wbGUgYXR0ZW5kIGNodXJjaCAob3IgcGxhY2Ugb2Ygd29yc2hpcCksIHdoaWNoIGlzIGFsc28gYSBjb3JlIGNvbXBvbmVudCBvZiBhbGwgcmVsaWdpb25zLiBUaGVzZSBsaW5lcyBzaG93IGFuIGV2ZW4gbW9yZSBwcm9ub3VuY2VkIGxlZnR3YXJkIHRpbHQuIFRoaXMgY2hhcnQgbWVhbnMgdGhhdCBwZW9wbGUgd2hvIGF0dGVuZCBjaHVyY2ggYXJlIG11Y2ggbW9yZSBsaWtlbHkgdG8gYmUgbW9yZSBjb25zZXJ2YXRpdmUgaW4gdGhlaXIgcmVsaWdpb3VzIGJlbGllZnMsIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIHRoZWlyIHBvbGl0aWNhbCBvcGluaW9ucyBhcmUgbW9yZSBsaWJlcmFsIHRoYW4gZmVsbG93IGJlbGlldmVycyB3aG8gZG9uJ3QgYXR0ZW5kIGNodXJjaC4KCgpgYGB7cixlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD04LjUsZmlnLmhlaWdodD02fQphdHRlbmRfc2xvcGUgPC0gIG9yZGluYWxfY29lZnMkYXR0ZW5kW2dyZXBsKHBhdHRlcm49J2FbMC05XScseD1hdHRyKG9yZGluYWxfY29lZnMkYXR0ZW5kLCdkaW1uYW1lcycpW1syXV0pXQphdHRlbmRfY29lZnMgPC0gb3JkaW5hbF9jb2VmcyRhdHRlbmRbZ3JlcGwocGF0dGVybj0nZFswLTldKycseD1hdHRyKG9yZGluYWxfY29lZnMkYXR0ZW5kLCdkaW1uYW1lcycpW1syXV0pXQphdHRlbmRfbGFiZWxzIDwtIGxldmVscyhkYXRhJGF0dGVuZClbMjpsZW5ndGgobGV2ZWxzKGRhdGEkYXR0ZW5kKSldCmRpbXMgPC0gc2FwcGx5KGF0dGVuZF9jb2VmcywgZnVuY3Rpb24oeCkgKC14KmF0dGVuZF9zbG9wZSkvKHNxcnQoc3VtKGF0dGVuZF9zbG9wZV4yKSkpKQoKYWxsX3BvaW50cyA8LSBjYWxjX3BvaW50cyhkaW1zPWRpbXMscmVjdGFuZ2xlX3Njb3JlcyA9IHJlY3RhbmdsZV9zY29yZXMsbGFiZWxzPWF0dGVuZF9sYWJlbHMpCgojT2Zmc2V0IHRleHQgbGFiZWxzCmRpbXNbMixdIDwtIGRpbXNbMixdICsgc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PW5jb2woZGltcykpCgp0ZXh0X2RhdGEgPC0gZGF0YV9mcmFtZShkaW0xPWRpbXNbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICBkaW0yPWRpbXNbMixdLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YXR0ZW5kX2xhYmVscykKCgpzYW1wbGVfc2NvcmVzICU+JSBwbG90X2x5KHk9fkYyLHg9fkYxLHRleHQ9fmRhdGFfbGFiZWxzLGNvbG9ycz0nR3JlZW5zJykgJT4lIGFkZF9tYXJrZXJzKGhvdmVyaW5mbz0ndGV4dCcsbmFtZT0nQWxsIFJlc3BvbmRlbnRzJyxvcGFjaXR5PTAuMixzaXplPTEpICU+JSAKICBsYXlvdXQoYW5ub3RhdGlvbnM9YSx4YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLAogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSIiLHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLHNob3dsZWdlbmQ9RkFMU0UsCiAgICAgICAgIHRpdGxlPSdIb3cgb2Z0ZW4gZG8geW91IGF0dGVuZCB5b3VyIHBsYWNlIG9mIHdvcnNoaXA/JykgJT4lIGFkZF9saW5lcyhkYXRhPWFsbF9wb2ludHMseT1+eXBvaW50cyx4PX54cG9pbnRzLGNvbG9yPX5jYXRlZ29yaWVzLGluaGVyaXQ9RkFMU0UsbmFtZT0nYXR0ZW5kYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1+Y2F0ZWdvcmllcykgJT4lIGFkZF90ZXh0KGRhdGE9dGV4dF9kYXRhLHg9fmRpbTEseT1+ZGltMix0ZXh0PX5sYWJlbHMsbmFtZT0nUG9pbnQgTGFiZWxzJyx0ZXh0cG9zaXRpb249J2JvdHRvbScsY29sb3I9SSgnZ3JheTMwJyksc2hvd2xlZ2VuZD1GQUxTRSkKYGBgCgoKTm93IHRoYXQgd2UndmUgZGlhZ25vc2VkIHRoZSB2ZXJ5IGludGVyZXN0aW5nIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHJlbGlnaW91cyBiZWxpZWYgYW5kIHJlbGlnaW91cyBwcmFjdGljZSwgd2UgY2FuIGxvb2sgYXQgZGl2aXNpdmUgcG9saXRpY2FsIGFuZCByZWxpZ2lvdXMgcXVlc3Rpb25zIHRoYXQgd2VyZSBhc2tlZCBvZiByZXNwb25kZW50cy4gRmlyc3QsIHdlJ2xsIHVzZSBhIHF1ZXN0aW9uIHRoYXQgbWVhc3VyZXMgdGhlIGV4Y2x1c2l2aXR5IG9mIHBlb3BsZSdzIHJlbGlnaW91cyBjb21taXRtZW50cy4gVGhpcyBxdWVzdGlvbiBhc2tlZCwgImlzIHlvdXIgcmVsaWdpb24gdGhlIG9uZSwgdHJ1ZSBmYWl0aCBsZWFkaW5nIHRvIGV0ZXJuYWwgbGlmZSwgb3IgY2FuIG1hbnkgcmVsaWdpb25zIGxlYWQgdG8gZXRlcm5hbCBsaWZlPyIgV2Ugb25seSBwdXQgb25lIGxpbmUgb24gdGhlIGNoYXJ0IGJlbG93IGJlY2F1c2UgdGhpcyBpcyBhIHNpbXBsZSB5ZXMvbm8gcXVlc3Rpb24uIFRob3NlIHRvIHRoZSByaWdodCBvZiB0aGUgbGluZSBzYWlkIHRoYXQgdGhlaXIgcmVsaWdpb24gaXMgZXhjbHVzaXZlLCB3aGlsZSB0aG9zZSB0byB0aGUgbGVmdCBzYWlkIHRoYXQgbWFueSByZWxpZ2lvbnMgY2FuIGxlYWQgdG8gZXRlcm5hbCBsaWZlLiBUaGlzIHF1ZXN0aW9uIGRvZXMgbm90IHRlbGwgdXMgbXVjaCwgaWYgYW55dGhpbmcsIGFib3V0IHNvbWVvbmUncyBwb2xpdGljYWwgdmlld3MsIGJ1dCBpdCBkb2VzIGNsZWFybHkgZGVsaW5lYXRlIHRob3NlIHdobyBhcmUgdmVyeSBjb25zZXJ2YXRpdmUgaW4gdGhlaXIgcmVsaWdpb3VzIGJlbGllZnMgZnJvbSB0aG9zZSB3aG8gYXJlbid0LgoKCmBgYHtyLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTguNSxmaWcuaGVpZ2h0PTZ9CnFoMV9zbG9wZSA8LSAgb3JkaW5hbF9jb2VmcyRxaDFbZ3JlcGwocGF0dGVybj0nYVswLTldJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRxaDEsJ2RpbW5hbWVzJylbWzJdXSldCnFoMV9jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJHFoMVtncmVwbChwYXR0ZXJuPSdkJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRxaDEsJ2RpbW5hbWVzJylbWzJdXSldCnFoMV9sYWJlbHMgPC0gbGV2ZWxzKGRhdGEkcWgxKVsyOmxlbmd0aChsZXZlbHMoZGF0YSRxaDEpKV0KZGltcyA8LSBzYXBwbHkocWgxX2NvZWZzLCBmdW5jdGlvbih4KSAoLXgqcWgxX3Nsb3BlKS8oc3FydChzdW0ocWgxX3Nsb3BlXjIpKSkpCgphbGxfcG9pbnRzIDwtIGNhbGNfcG9pbnRzKGRpbXM9ZGltcyxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcyxsYWJlbHM9J1llcyAgICBObycpCgojT2Zmc2V0IHRleHQgbGFiZWxzCmRpbXNbMixdIDwtIGRpbXNbMixdICsgc2VxKGZyb209LTIsdG89MixsZW5ndGgub3V0PW5jb2woZGltcykpCgp0ZXh0X2RhdGEgPC0gZGF0YV9mcmFtZShkaW0xPWRpbXNbMSxdLAogICAgICAgICAgICAgICAgICAgICAgICBkaW0yPTEsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz0nWWVzICAgIE5vJykKCgpzYW1wbGVfc2NvcmVzICU+JSBwbG90X2x5KHk9fkYyLHg9fkYxLHRleHQ9fmRhdGFfbGFiZWxzLGNvbG9ycz0nR3JlZW5zJykgJT4lIGFkZF9tYXJrZXJzKGhvdmVyaW5mbz0ndGV4dCcsbmFtZT0nQWxsIFJlc3BvbmRlbnRzJyxvcGFjaXR5PTAuMixzaXplPTEpICU+JSAKICBsYXlvdXQoYW5ub3RhdGlvbnM9YSxzaG93bGVnZW5kPUZBTFNFLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHRpdGxlPSdDYW4gbWFueSByZWxpZ2lvbnMgbGVhZCB0byBldGVybmFsIGxpZmU/JykgJT4lIGFkZF9saW5lcyhkYXRhPWFsbF9wb2ludHMseT1+eXBvaW50cyx4PX54cG9pbnRzLGNvbG9yPX5jYXRlZ29yaWVzLGluaGVyaXQ9RkFMU0UsbmFtZT0ncWgxYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1+Y2F0ZWdvcmllcykgJT4lIGFkZF90ZXh0KGRhdGE9dGV4dF9kYXRhLHg9fmRpbTEseT1+ZGltMix0ZXh0PX5sYWJlbHMsbmFtZT0nUG9pbnQgTGFiZWxzJyxjb2xvcj1JKCdncmF5MzAnKSkKYGBgCgoKV2UgZmlyc3QgbG9vayBhdCB0aGUgcXVlc3Rpb24gb24gaG9tb3NleHVhbGl0eSwgd2hpY2ggd2Uga25vdyBpcyB2ZXJ5IGRpdmlzaXZlIG9uIGJvdGggZGltZW5zaW9ucy4gVGhpcyBxdWVzdGlvbiBhc2tlZCByZXNwb25kZW50cywgInNob3VsZCBob21vc2V4dWFsaXR5IGJlIGFjY2VwdGVkIGJ5IHNvY2lldHk/IiBVbmxpa2UgcmVsaWdpb3VzIHByYWN0aWNlLCB0aGlzIHF1ZXN0aW9uIGhhcyBhIHN0cm9uZyByaWdodHdhcmQgdGlsdC4gVGhpcyBtZWFucyB0aGF0IHRob3NlIHdobyB0aGluayBob21vc2V4dWFsaXR5IHNob3VsZCBiZSBkaXNjb3VyYWdlZCBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgY29uc2VydmF0aXZlIHBvbGl0aWNhbGx5IGFuZCByZWxpZ2lvdXNseS4gVGhpcyBxdWVzdGlvbiB3b3VsZCBhcHBlYXIgdG8gZXhlbXBsaWZ5IHRoZSBkaXZpZGUgYmV0d2VlbiB0aGUgZ3JvdXBzIHRoYXQgbWF0Y2ggY29uc2VydmF0aXZlIHJlbGlnaW91cyBiZWxpZWZzIHRvIGNvbnNlcnZhdGl2ZSBwb2xpdGljcyBhbmQgdmljZSB2ZXJzYS4gVGhpcyBsaW5lIGN1dHMgdGhlIE1pbGt5IFdheSBnYWxheHkgb2Ygc3VydmV5IHJlc3BvbmRlbnRzIG5lYXRseSBpbiBoYWxmLiBXZSBjYW4gYWxzbyBzZWUgdGhhdCB0aGVyZSBhcmUgaW4gZ2VuZXJhbCBtb3JlIHJlc3BvbmRlbnRzIG9uIHRoZSBhY2NlcHQgaG9tb3NleHVhbGl0eSBzaWRlIHRoYW4gdGhlIGRpc2NvdXJhZ2UgaG9tb3NleHVhbGl0eSBzaWRlLgoKCmBgYHtyLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTguNSxmaWcuaGVpZ2h0PTZ9CnFiMmFfc2xvcGUgPC0gIG9yZGluYWxfY29lZnMkcWIyYVtncmVwbChwYXR0ZXJuPSdhWzAtOV0nLHg9YXR0cihvcmRpbmFsX2NvZWZzJHFiMmEsJ2RpbW5hbWVzJylbWzJdXSldCnFiMmFfY29lZnMgPC0gb3JkaW5hbF9jb2VmcyRxYjJhW2dyZXBsKHBhdHRlcm49J2QnLHg9YXR0cihvcmRpbmFsX2NvZWZzJHFiMmEsJ2RpbW5hbWVzJylbWzJdXSldCnFiMmFfbGFiZWxzIDwtIGxldmVscyhkYXRhJHFiMmEpWzI6bGVuZ3RoKGxldmVscyhkYXRhJHFiMmEpKV0KZGltcyA8LSBzYXBwbHkocWIyYV9jb2VmcywgZnVuY3Rpb24oeCkgKC14KnFiMmFfc2xvcGUpLyhzcXJ0KHN1bShxYjJhX3Nsb3BlXjIpKSkpCgphbGxfcG9pbnRzIDwtIGNhbGNfcG9pbnRzKGRpbXM9ZGltcyxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcyxsYWJlbHM9J1llcyAgICBObycpCgoKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9YWxsX3BvaW50cyR4cG9pbnRzWzYwMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRpbTI9YWxsX3BvaW50cyR5cG9pbnRzWzYwMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz0nWWVzICAgIE5vJykKCgpzYW1wbGVfc2NvcmVzICU+JSBwbG90X2x5KHk9fkYyLHg9fkYxLHRleHQ9fmRhdGFfbGFiZWxzLGNvbG9ycz0nR3JlZW5zJykgJT4lIGFkZF9tYXJrZXJzKGhvdmVyaW5mbz0ndGV4dCcsbmFtZT0nQWxsIFJlc3BvbmRlbnRzJyxvcGFjaXR5PTAuMixzaXplPTEpICU+JSAKICBsYXlvdXQoYW5ub3RhdGlvbnM9YSxzaG93bGVnZW5kPUZBTFNFLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHRpdGxlPSdTaG91bGQgaG9tb3NleHVhbGl0eSBiZSBhY2NlcHRlZCBieSBzb2NpZXR5PycpICU+JSBhZGRfbGluZXMoZGF0YT1hbGxfcG9pbnRzLHk9fnlwb2ludHMseD1+eHBvaW50cyxjb2xvcj1+Y2F0ZWdvcmllcyxpbmhlcml0PUZBTFNFLG5hbWU9J3FiMmFhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PX5jYXRlZ29yaWVzKSAgJT4lIGFkZF90ZXh0KGRhdGE9dGV4dF9kYXRhLHg9fmRpbTEseT1+ZGltMix0ZXh0PX5sYWJlbHMsbmFtZT0nUG9pbnQgTGFiZWxzJyxjb2xvcj1JKCdncmF5MzAnKSkKYGBgCgpOZXh0IHdlJ2xsIGV4YW1pbmUgZW52aXJvbm1lbnRhbCBwb2xpY3kuIFRoaXMgcXVlc3Rpb24gYXNrZWQgcmVzcG9uZGVudHMgd2hldGhlciBzdHJpY3RlciBlbnZpcm9ubWVudGFsIHJlZ3VsYXRpb25zIGFyZSB3b3J0aCB0aGUgYWRkZWQgY29zdC4gVGhpcyBxdWVzdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBob21vc2V4dWFsaXR5IHF1ZXN0aW9uIGJlY2F1c2UgaXQgYnJlYWtzIGRvd24gYWxvbmcgcG9saXRpY2FsIGFuZCByZWxpZ2lvdXMgbGluZXMuIFBlb3BsZSB3aG8gdGhpbmsgZW52aXJvbm1lbnRhbCByZWd1bGF0aW9ucyBhcmUgbW9yZSBpbXBvcnRhbnQgdGVuZCB0byBiZSBtb3JlIGxpYmVyYWwgYm90aCBwb2xpdGljYWxseSBhbmQgcmVsaWdvdXNseSwgYWx0aG91Z2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBzdHJvbmdlciBmb3IgdGhlaXIgcG9saXRpY2FsIGlkZW9sb2d5IHRoYW4gZm9yIHRoZWlyIGZhaXRoLgoKCmBgYHtyLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTguNSxmaWcuaGVpZ2h0PTZ9CnFiMmNfc2xvcGUgPC0gIG9yZGluYWxfY29lZnMkcWIyY1tncmVwbChwYXR0ZXJuPSdhWzAtOV0nLHg9YXR0cihvcmRpbmFsX2NvZWZzJHFiMmMsJ2RpbW5hbWVzJylbWzJdXSldCnFiMmNfY29lZnMgPC0gb3JkaW5hbF9jb2VmcyRxYjJjW2dyZXBsKHBhdHRlcm49J2QnLHg9YXR0cihvcmRpbmFsX2NvZWZzJHFiMmMsJ2RpbW5hbWVzJylbWzJdXSldCnFiMmNfbGFiZWxzIDwtIGxldmVscyhkYXRhJHFiMmMpWzI6bGVuZ3RoKGxldmVscyhkYXRhJHFiMmMpKV0KZGltcyA8LSBzYXBwbHkocWIyY19jb2VmcywgZnVuY3Rpb24oeCkgKC14KnFiMmNfc2xvcGUpLyhzcXJ0KHN1bShxYjJjX3Nsb3BlXjIpKSkpCgphbGxfcG9pbnRzIDwtIGNhbGNfcG9pbnRzKGRpbXM9ZGltcyxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcyxsYWJlbHM9J1llczxicj48YnI+PGJyPk5vJykKCgoKdGV4dF9kYXRhIDwtIGRhdGFfZnJhbWUoZGltMT1hbGxfcG9pbnRzJHhwb2ludHNbMzUwXSwKICAgICAgICAgICAgICAgICAgICAgICAgZGltMj1hbGxfcG9pbnRzJHlwb2ludHNbMzUwXSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPSdZZXM8YnI+PGJyPjxicj5ObycpCgoKc2FtcGxlX3Njb3JlcyAlPiUgcGxvdF9seSh5PX5GMix4PX5GMSx0ZXh0PX5kYXRhX2xhYmVscyxjb2xvcnM9J0dyZWVucycpICU+JSBhZGRfbWFya2Vycyhob3ZlcmluZm89J3RleHQnLG5hbWU9J0FsbCBSZXNwb25kZW50cycsb3BhY2l0eT0wLjIsc2l6ZT0xKSAlPiUgCiAgbGF5b3V0KGFubm90YXRpb25zPWEseGF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0iIixzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgdGl0bGU9J0FyZSBzdHJpY3RlciBlbnZpcm9ubWVudGFsIHJlZ3VsYXRpb25zIHdvcnRoIHRoZSBleHRyYSBjb3N0PycsCiAgICAgICAgIHNob3dsZWdlbmQ9RkFMU0UpICU+JSBhZGRfbGluZXMoZGF0YT1hbGxfcG9pbnRzLHk9fnlwb2ludHMseD1+eHBvaW50cyxjb2xvcj1+Y2F0ZWdvcmllcyxpbmhlcml0PUZBTFNFLG5hbWU9J3FiMmNhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PX5jYXRlZ29yaWVzKSAlPiUgYWRkX3RleHQoZGF0YT10ZXh0X2RhdGEseD1+ZGltMSx5PX5kaW0yLHRleHQ9fmxhYmVscyxuYW1lPSdQb2ludCBMYWJlbHMnLGNvbG9yPUkoJ2dyYXkzMCcpKQpgYGAKCgpCYXNlZCBvbiBvdXIgYW5hbHlzaXMgc28gZmFyLCB3ZSBrbm93IHRoYXQgY29yZSBwb2xpdGljYWwgcXVlc3Rpb25zLCBzdWNoIGFzIHdlbGZhcmUsIGVudmlyb25tZW50YWwgcmVndWxhdGlvbnMsIGFuZCBob21vc2V4dWFsaXR5IGNhbiBhbGwgZGl2aWRlIHBlb3BsZSBvbiBib3RoIHJlbGlnaW91cyBhbmQgcG9saXRpY2FsIGdyb3VuZHMuIFRoZSBzdHJvbmdlc3QgZGl2aWRlIGlzIG9uIGhvbW9zZXh1YWxpdHkuIEhvd2V2ZXIsIHdlIGFsc28gZmluZCB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHJlbGlnaW91cyBiZWxpZWYgYW5kIHJlbGlnaW91cyBwcmFjdGljZS4gUGVvcGxlIHdobyBhcmUgc2ltaWxhcmx5IGNvbnNlcnZhdGl2ZSBpbiByZWxpZ2lvdXMgYmVsaWVmIGRpZmZlciBpbiB0aGVpciBwb2xpdGljYWwgdmlld3MgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIHRoZXkgcHJhY3RpY2UgdGhlaXIgZmFpdGguIFRob3NlIHdobyBwcmFjdGljZSB0aGVpciBmYWl0aCBtb3JlIHRlbmQgdG8gYmUgbW9yZSBsaWJlcmFsIHBvbGl0aWNhbGx5IGFzIHdlbGwuCgpXZSdsbCBwdXQgdXAgb25lIGxhc3QgcXVlc3Rpb24gZnJvbSBvdXIgc3VydmV5LiBXZSBrbm93IGZyb20gdGhlIHBvbGxzIGR1cmluZyB0aGUgZWxlY3Rpb24gdGhhdCB0aGVyZSB3YXMgYSBkaXZpZGUgYmV0d2VlbiB5b3VuZ2VyIGFuZCBvbGRlciBldmFuZ2VsaWNhbHMgb3ZlciBwb2xpdGljYWwgY2FuZGlkYXRlcy0tZ2VuZXJhbGx5IHNwZWFraW5nLCBvbGRlciBldmFuZ2VsaWNhbHMgcHJlZmVycmVkIFRydW1wLCB3aGlsZSB5b3VuZ2VyIGV2YW5nZWxpY2FscyB3ZXJlIG11Y2ggbW9yZSBsaWtlbHkgdG8gcHJlZmVyIHRoaXJkLXBhcnR5IGNhbmRpZGF0ZXMgb3IgQ2xpbnRvbi4gRm9yIHRoaXMgY2hhcnQsIHdlJ2xsIHB1dCB1cCBib3RoIHRoZSBhZ2UgY2F0ZWdvcmllcyBhbmQgd2Ugd2lsbCBjb2xvciByZXNwb25kZW50cyBieSB3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBldmFuZ2VsaWNhbHMuIEl0IGRvZXMgbm90IHNob3cgYSBwcmV0dHkgcGljdHVyZS4gUGVvcGxlIHdobyBhcmUgeW91bmdlciB0ZW5kIHRvIGJlIGJvdGggbW9yZSBsaWJlcmFsIHBvbGl0aWNhbGx5IGFuZCByZWxpZ2lvdXNseS4gT24gdGhlIGZsaXAgc2lkZSwgcGVvcGxlIHdobyBhcmUgZXZhbmdlbGljYWxzIGFyZSB2ZXJ5IGNvbnNlcnZhdGl2ZSBpbiBnZW5lcmFsIGluIHRlcm1zIG9mIHRoZWlyIHJlbGlnaW91cyB2aWV3cywgYW5kIGV2ZW4gY29tcGFyZWQgdG8gcGVvcGxlIHdobyBzaGFyZSB0aGUgc2FtZSByZWxpZ2lvdXMgdmlld3MgYnV0IHdvdWxkbid0IGNob29zZSB0aGUgbGFiZWwgZXZhbmdlbGljYWwsIHRoZXkgYXJlIG1vcmUgY29uc2VydmF0aXZlIHBvbGl0aWNhbGx5LiBJbiB0b3RhbCwgaXQgc2VlbXMgdGhhdCB0aGVyZSBpcyBhIGxvb21pbmcgc3BsaXQgaW4gdGhlIGV2YW5nZWxpY2FsIGNodXJjaCBiZXR3ZWVuIHlvdW5nZXIgYW5kIG9sZGVyIGJlbGlldmVycywgd2l0aCB5b3VuZ2VyIGJlbGlldmVycyBtb3ZpbmcgYXdheSBmcm9tIHRoZWlyIG9sZGVyIHBlZXJzIGluIGJvdGggcmVsaWdpb3VzIGZhaXRoIGFuZCBwb2xpdGljYWwgaWRlb2xvZ3kuCgoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTguNSxmaWcuaGVpZ2h0PTZ9CmFnZXJlY19zbG9wZSA8LSAgb3JkaW5hbF9jb2VmcyRhZ2VyZWNbZ3JlcGwocGF0dGVybj0nYVswLTldJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRhZ2VyZWMsJ2RpbW5hbWVzJylbWzJdXSldCmFnZXJlY19jb2VmcyA8LSBvcmRpbmFsX2NvZWZzJGFnZXJlY1tncmVwbChwYXR0ZXJuPSdkWzAtOV0rJyx4PWF0dHIob3JkaW5hbF9jb2VmcyRhZ2VyZWMsJ2RpbW5hbWVzJylbWzJdXSldCmFnZXJlY19sYWJlbHMgPC0gbGV2ZWxzKGRhdGEkYWdlcmVjKVsyOmxlbmd0aChsZXZlbHMoZGF0YSRhZ2VyZWMpKV0KZGltcyA8LSBzYXBwbHkoYWdlcmVjX2NvZWZzLCBmdW5jdGlvbih4KSAoLXgqYWdlcmVjX3Nsb3BlKS8oc3FydChzdW0oYWdlcmVjX3Nsb3BlXjIpKSkpCgphbGxfcG9pbnRzIDwtIGNhbGNfcG9pbnRzKGRpbXM9ZGltcyxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcyxsYWJlbHM9YWdlcmVjX2xhYmVscykKCmFsbF9wb2ludHNfZXZhbiA8LSBjYWxjX3BvaW50cyhkaW1zPW1hdHJpeChjKHJlbHRyYWRfZGF0YSRkaW0xWzJdLHJlbHRyYWRfZGF0YSRkaW0yWzJdKSxucm93PTIsbmNvbD0xKSxyZWN0YW5nbGVfc2NvcmVzID0gcmVjdGFuZ2xlX3Njb3JlcyxsYWJlbHM9J0V2YW5nZWxpY2FscycpCiAKCnRleHRfZGF0YSA8LSBkYXRhX2ZyYW1lKGRpbTE9ZGltc1sxLF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRpbTI9ZGltc1syLF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1hZ2VyZWNfbGFiZWxzKQoKdGV4dF9kYXRhX2V2YW4gPC0gZGF0YV9mcmFtZShkaW0xPWFsbF9wb2ludHNfZXZhbiR4cG9pbnRzWzEwMDBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbTI9YWxsX3BvaW50c19ldmFuJHlwb2ludHNbMTAwMF0rLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPSdFdmFuZ2VsaWNhbHMnKQoKZGF0YV9ldmFuIDwtIGZpbHRlcihzYW1wbGVfc2NvcmVzLGlmX2Vsc2Uoc2FtcGxlX2RhdGEkUkVMVFJBRCAlaW4lICdFdmFuZ2VsaWNhbDxicj5Qcm90ZXN0YW50JyxUUlVFLEZBTFNFKSkKCiMgJT4lIAojICAgYWRkX3RleHQoZGF0YT10ZXh0X2RhdGFfZXZhbix4PX5kaW0xLHk9fmRpbTIsdGV4dD1+bGFiZWxzLGNvbG9yPUkoJ3JlZCcpLHRleHRwb3NpdGlvbj0ndG9wIGNlbnRlcicpCgojIG5lZWQgdG8gZHJvcCBwZW9wbGUgd2hvIGFyZSByZWFsbHkgb2xkCgphbGxfcG9pbnRzIDwtIGFsbF9wb2ludHMgJT4lIGdyb3VwX2J5KGNhdGVnb3JpZXMpICU+JSBtdXRhdGUobWVhbl94PW1lYW4oeHBvaW50cykpICU+JSBmaWx0ZXIobWVhbl94PHJlY3RhbmdsZV9zY29yZXNbJ21heF94J10pCnRleHRfZGF0YSA8LSBmaWx0ZXIodGV4dF9kYXRhLGxhYmVscyAlaW4lIHVuaXF1ZShhbGxfcG9pbnRzJGNhdGVnb3JpZXMpKQphbGxfcG9pbnRzICU+JSBwbG90X2x5KHk9fnlwb2ludHMseD1+eHBvaW50cykgICU+JSBhZGRfbGluZXMoY29sb3I9fmNhdGVnb3JpZXMsdGV4dD1+Y2F0ZWdvcmllcyxjb2xvcnM9J0dyZWVucycsaG92ZXJpbmZvPSdub25lJykgJT4lIGFkZF90ZXh0KGRhdGE9dGV4dF9kYXRhLHg9fmRpbTEseT1+ZGltMix0ZXh0PX5sYWJlbHMsbmFtZT0nUG9pbnQgTGFiZWxzJyx0ZXh0cG9zaXRpb249J2JvdHRvbScsY29sb3I9SSgnZ3JheTMwJykpICU+JSBhZGRfaGlzdG9ncmFtMmRjb250b3VyKGRhdGE9ZGF0YV9ldmFuLHg9fkYxLHk9fkYyLG9wYWNpdHk9MC40LGhvdmVyaW5mbz0nbm9uZScsY29sb3JiYXI9bGlzdCh0aXRsZT0nIyBvZiBFdmFuZ2VsaWNhbHMnLHhhbmNob3I9J2JvdHRvbScpLGNvbG9ycz0nUmVkcycpICU+JQogIGxheW91dChhbm5vdGF0aW9ucz1hLHhheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IiIsc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHRpdGxlPSdBZ2UgJiBFdmFuZ2VsaWNhbHMnLHNob3dsZWdlbmQ9RkFMU0UpCgpgYGAKCgpUaGlzIHdhcyBhbiBleHBsb3JhdG9yeSBhbmFseXNpcywgYW5kIHRoZXNlIGNvbmNsdXNpb25zIGFyZW4ndCBmaXJtLiBCdXQgdGhleSBkbyBpbmRpY2F0ZSB0aGUgbmF0dXJlIG9mIHBvbGl0aWNzIGFuZCByZWxpZ2lvbiBpbiBBbWVyaWNhIHRvZGF5LCBhbmQgdGhlIGlzc3VlcyB0aGF0IGRpdmlkZSB1cyBhbmQgdW5pdGUgdXMuIEFsc28sIHdlIHNob3VsZG4ndCBqdXN0IHRoaW5rIG9mIHJlbGlnaW91cyBpZGVudGl0eSBhcyBhIGxpc3Qgb2YgcXVlc3Rpb25zIGJ1dCBhbHNvIGFzIGEgbGlzdCBvZiBwcmFjdGljZXMuIFdoZW4gd2Ugbm90ZSB0aGF0IGNlcnRhaW4gcG9saXRpY2FsIGlzc3VlcyB0ZW5kIHRvIGRpdmlkZSBBbWVyaWNhbnMgb24gYm90aCByZWxpZ2lvdXMgYW5kIHBvbGl0aWNhbCBncm91bmRzLCB3ZSBjYW4ndCBhc3N1bWUgdGhhdCBhbGwgQW1lcmljYW5zIGFyZSBlcXVhbGx5IGRldm90ZWQgdG8gdGhlaXIgcmVsaWdpb3VzIHRyYWRpdGlvbnMgZXZlbiBpZiB0aGV5IGJlbGlldmUgdGhlbSB0byBiZSB0cnVlLiBBcyBpcyBvZnRlbiB0aGUgY2FzZSwgcmVhbGl0eSBpcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gb3VyIGxpbWl0ZWQgcGVyc3BlY3RpdmVzIGFsbG93IGl0IHRvIGJlLgoKVGhlIHBvdGVudGlhbCBjb25mbGljdCBiZXR3ZWVuIHlvdW5nZXIgYW5kIG9sZGVyIGV2YW5nZWxpY2FscyB0aGF0IG91ciBsYXN0IGNoYXJ0IGlsbHVzdHJhdGVzIGlzIHBhcnQgb2Ygd2hhdCBtb3RpdmF0ZXMgdGhpcyB3ZWIgcGFnZS4gV2Ugd2FudCB0byBvZmZlciBhIHNwYWNlIGZvciB5b3VuZyBldmFuZ2VsaWNhbHMgdG8gaGFzaCBvdXQgdGhlaXIgcG9saXRpY2FsIGFuZCByZWxpZ2lvdXMgZGlmZmVyZW5jZXMgaW4gYSBzZXR0aW5nIHRoYXQgaXMgbm9uLWNvbmZyb250YXRpb25hbCwgYmlibGljYWxseS1vcmllbnRlZCwgYW5kIG9wZW4gdG8gYW55IGtpbmQgb2YgY29udHJvdmVyc2lhbCB0b3BpYy4gV2UgZG9uJ3Qgd2FudCB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gYXNraW5nIHdobyB0byB2b3RlIGZvciBldmVyeSBmb3VyIHllYXJzLCBidXQgcmF0aGVyIHdlIHdhbnQgdG8gYmUgQ2hyaXN0aWFucyB3aG8gZm9sbG93IENocmlzdCBpbiBhIHBvbGl0aWNhbCB3b3JsZC4=